我似乎毫无理由地收到错误 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);
和有什么不一样?我还以为是同一件事呢
为什么有人在你的情况下不起作用,需要更多细节才能明确回答。
和char buffer[10];
有什么区别?我还以为是同一件事呢char *buffer = malloc(10);
这个问题比较好回答。
在前一种情况下,如果位于函数内,则会在堆栈上自动分配十个字节。尝试返回指向函数内存
outside
的指针将导致未定义的行为,因为该内存可能会被堆栈上的另一个函数调用重用,因此在函数调用之外不再有效。
在后一种情况下使用
malloc
,内存是动态分配的。指向它的指针可以从函数返回并在另一个函数中使用。不过,内存不会自动回收,必须用free
刻意释放。
根据您如何使用此内存,这可以很好地解释为什么使用
malloc
有效而 char buffer[10];
无效。我强烈建议在编译时打开警告。