创建字符数组后访问不良

时间:2015-11-25 16:16:57

标签: objective-c arrays memory-management

我似乎在我的申请中遇到了一些限制,但我很困惑。

编辑下来,问题代码似乎是:

NSInteger tcMax = 9000000;  // 8 million here and all is ok. 9 or more = crash
char tcBuffer[tcMax];

[self doSomething];  // EXC BAD ACCESS here. Or whatever other line of code is here

我已将这些线条粘贴到一个新项目中并且一切都很好,所以似乎还有其他因素在起作用。是否可以通过特定方法分配总字节数的最大值?或者其他一些限制,我可以在这个8/9 Mb点左右倾斜?

2 个答案:

答案 0 :(得分:0)

我没有在我面前安装我的Mac,但我相当确定9 MB是否太大了堆栈分配。您将在固定大小的阵列中使用大量内存分配来填充堆栈(因此,堆栈溢出)。转换为堆分配

char* tcBuffer = (char*)malloc(tcMax);

[self doSomething];

// before the function/method returns call this:
free(tcBuffer);
tcBuffer = NULL;

在这方面,iOS可能与MacOS有不同的行为。

答案 1 :(得分:0)

动态程序存储器受限(最大值变化)。

对于大型数组,使用mallocfree来使用堆。