Объявление массива на основе стека в 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,

Другие вопросы по тегам