在Objective C(iOS)中的VLA可变长度数组,会发生什么?

时间:2014-01-13 10:46:24

标签: ios objective-c arrays cocoa

从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次崩溃。

1 个答案:

答案 0 :(得分:2)

它很可能会在堆栈中粘贴数组的内存,这就是为什么当你将堆栈炸掉36,000 * sizeof(CLLocationCoordinate2D)时崩溃的原因。