Объявление массива на основе стека в Objective-C?
В Objective-C я объявляю массив C следующим образом:
длина int = 10;
int a [длина];
Это не вызывает никаких ошибок в XCode, но другие компиляторы, такие как Visual Studio. Пожалуйста, скажите мне, как это работает. Я должен использовать это или использовать вместо этого malloc/calloc?
1 ответ
Массивы переменной длины были введены в C99. Насколько мне известно, текущий компилятор Microsoft (VC2010) не поддерживает C99 (или, по крайней мере, его часть VLA).
Вы можете использовать malloc
чтобы сделать то же самое, вы просто должны помнить free
это когда вы закончите.
Что-то вроде:
int length = 10;
int *a = malloc (length * sizeof(int));
if (a == NULL) {
doSomethingIntelligentSinceNoMemoryLeft();
} else {
useToHeartsContent (a[0], "thru", a[9]);
free (a);
}
Вы также можете использовать alloca
который похож на VLA в том, что он выделяет пространство в стеке для блоков памяти переменных.
Но вы должны быть осторожны. В то время как alloca
дает автоматическое перераспределение при выходе из функции, стек обычно меньше, чем malloc
куча и, если вы исчерпали кучу, он возвращает вам NULL. Если вы взорвете свой стек, это, вероятно, проявится как сбой.
alloca(n)
вероятно, приемлемо для достаточно малых значений n
,