Pull to refresh

Comments 9

Помню, когда только начал изучать С, на одной из первых лабораторных работ недоумевал, почему нельзя объявить такой массив и как же теперь быть :)
и как же теперь быть :)

Пользоваться функцией alloca.
В последнее время, я стараюсь обрабатывать неизвестный объём данных блоками с известной длиной.
Аргумент int он такой — как бы случайно не создать массив с 2-мя миллиардами целых чисел в рантайме :)
На мой взгляд, это не лучшая идея, даже сравнительно VLAs. Насколько мне известно, alloca не стандартизирована ни в C89, ни в C99. Цитата из linux man:
RETURN VALUE The alloca() function returns a pointer to the beginning of the allocated space. If the allocation causes stack overflow, program behaviour is undefined
Если обычный массив переполнит стек, то вы в общем-то тоже никаких гарантий не получите.
alloca отличается от таких массивов. И лучше избегать использовать alloca.

У подобного кода, скорее всего закончится стек.

for (int i = 0; i < 100000; ++i) {
char *p = alloca(i);

}

У такого нет.
for (int i = 0; i < 100000; ++i) {
char p[i];

}
Насколько я знаю, что free будет в конце функции. А ручного вроде как нет… Можно засунуть ее в inline-функцию и всю логику в ней сосредоточить.
Создание массива в стеке и его уничтожение практически не занимает процессорного времени, чего не скажешь о создании и уничтожении массива в куче. Для временных массивов очень удобно и эффективно.
Sign up to leave a comment.

Articles