Объявление массива на основе стека в Objective-C? - PullRequest
2 голосов
/ 31 октября 2011

В Objective-C я объявляю массив C следующим образом:

int length = 10;
int a [длина];

Это не вызывает никаких ошибок в XCode, но других компиляторах, таких как Visual Studio. Пожалуйста, скажите мне, как это работает. Должен ли я использовать его или вместо него использовать malloc / calloc?

1 Ответ

6 голосов
/ 31 октября 2011

Массивы переменной длины были введены в 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.

...