Комментарии 9
Помню, когда только начал изучать С, на одной из первых лабораторных работ недоумевал, почему нельзя объявить такой массив и как же теперь быть :)
и как же теперь быть :)
Пользоваться функцией alloca.
В последнее время, я стараюсь обрабатывать неизвестный объём данных блоками с известной длиной.
Аргумент int он такой — как бы случайно не создать массив с 2-мя миллиардами целых чисел в рантайме :)
Аргумент 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];
…
}
У подобного кода, скорее всего закончится стек.
for (int i = 0; i < 100000; ++i) {
char *p = alloca(i);
…
}
У такого нет.
for (int i = 0; i < 100000; ++i) {
char p[i];
…
}
Создание массива в стеке и его уничтожение практически не занимает процессорного времени, чего не скажешь о создании и уничтожении массива в куче. Для временных массивов очень удобно и эффективно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
GCC и Variable-Length Arrays