Objective-C 字符数组初始化在访问属性时导致 EXC_BAD_ACCESS

问题描述 投票:0回答:1

我似乎毫无理由地收到错误 EXC_BAD_ACCESS。经过大量调试后,我发现了问题,但我不知道为什么会发生。 以下是发生这种情况的一些示例: 1.

char buffer[10];
NSFileHandle *handle = [file handle]; // Throws EXC_BAD_ACCESS
NSData *data = [handle readDataOfLength:10];
[handle getBytes:buffer length:10];
NSFileHandle *handle = [file handle];
NSData *data = [handle readDataOfLength:10];
char buffer[10];
[handle getBytes:buffer length:10]; // Throws EXC_BAD_ACCESS
NSFileHandle *handle = [file handle];
NSData *data = [handle readDataOfLength:10];
char buffer[1];
[handle getBytes:buffer length:1]; // Works but I need a larger buffer.
char *buffer = malloc(10);
NSFileHandle *handle = [file handle];
NSData *data = [handle readDataOfLength:10];
[handle getBytes:buffer length:10]; // Works completely fine.

我不明白为什么这会突然成为一个问题,代码工作了很长时间,然后突然停止工作。我认为 malloc 分配内存的方式有点不同。我不明白初始化数组如何使我的对象无法访问,我不希望它覆盖分配的内存。

char buffer[10];
char *buffer = malloc(10);
和有什么不一样?我还以为是同一件事呢

arrays objective-c memory malloc
1个回答
0
投票

为什么有人在你的情况下不起作用,需要更多细节才能明确回答。

char buffer[10];
char *buffer = malloc(10);
有什么区别?我还以为是同一件事呢

这个问题比较好回答。

在前一种情况下,如果位于函数内,则会在堆栈上自动分配十个字节。尝试返回指向函数内存

outside
的指针将导致未定义的行为,因为该内存可能会被堆栈上的另一个函数调用重用,因此在函数调用之外不再有效。

在后一种情况下使用

malloc
,内存是动态分配的。指向它的指针可以从函数返回并在另一个函数中使用。不过,内存不会自动回收,必须用
free
刻意释放。

根据您如何使用此内存,这可以很好地解释为什么使用

malloc
有效而
char buffer[10];
无效。我强烈建议在编译时打开警告。

© www.soinside.com 2019 - 2024. All rights reserved.