从iOS应用程序维护一些代码,我发现了以下内容:
CLLocationCoordinate2D inputArray[size]; // CLLocationCoordinate2D is a struct containing two doubles
for (int i = 0; i < size; i++) {
inputArray[i] = ... ; // Fill the array
}
CLLocationCoordinate2D outputArray[size];
functionThatConvertsInputToOutput(inputArray, outputArray, size);
这里我们正在分配两个动态大小的结构数组(在编译时无法确定大小)。所谓的“可变长度数组”,基于该SO问题(Declare Dynamic Array)。
我很清楚,这甚至都没有在C / C ++中编译,在处理类似的问题时,答案通常是“使用malloc”或“使用NS(Mutable)数组”。
但我还没有真正找到问题的答案:
宣布int array[size];
时,目标C会发生什么?
我想知道的是,我在上面复制的代码片段在使用尺寸相当大的VLA(36000)时会崩溃,并且在使用malloc时不会崩溃:
CLLocationCoordinate2D *inputArray = malloc(sizeof(CLLocationCoordinate2D) * size);
CLLocationCoordinate2D *ouputArray = malloc(sizeof(CLLocationCoordinate2D) * size);
编辑#1:维基百科关于VLA http://en.wikipedia.org/wiki/Variable-length_array
的内容编辑#2:在EXC_BAC_ACCESS
或调用functionThatConvertsInputToOutput
的线路上的奇数位置发生functionThatConvertsInputToOutput
次崩溃。
答案 0 :(得分:2)
它很可能会在堆栈中粘贴数组的内存,这就是为什么当你将堆栈炸掉36,000 * sizeof(CLLocationCoordinate2D)时崩溃的原因。