LINUX.ORG.RU

Си почему нельзя выделять большой многомерный массив в GCC

 


0

1

gcc 9.2.0

такой код падает (при запуске)

int w=1200;
int h=1200;
unsigned char array[w][h][2];

такой не падает

int w=1200;
int h=1200;
unsigned char *array;
array=(unsigned char*) malloc(2*w*h);
free(array);

я чтото фундаментальное упустил/забыл? В спеках Си какието ограничения на размер массива есть? В других компиляторах и другой версии GCC работает (но нужна именно эта версия для сборки)

Ответ на: комментарий от Legioner

C VLA везде должен падать.

Не зря на эту хрень есть предупреждения и в cppcheck и в clang.

И из ядра Linux вычистили это говно.

При VLA никак нельзя узнать упадёт программа или нет, так как нельзя узнать сколько свободного места осталось в стеке. И если нужно выделить больше чем осталось, то всё упадёт.

anonymous
()
Ответ на: комментарий от anonymous

C VLA везде должен падать.

С чего это вдруг? Этот код жрёт 2 МБ памяти. В стеке - 8. Я протестировал - у меня не падает на gcc 11.

При VLA никак нельзя узнать упадёт программа или нет, так как нельзя узнать сколько свободного места осталось в стеке. И если нужно выделить больше чем осталось, то всё упадёт.

И с malloc тоже нельзя узнать, упадёт программа или нет. По крайней мере в современном линуксе с умолчальными настройками.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

у меня не падает на gcc 11.

на gcc 9.2.0 тоже не падает.

https://gcc.godbolt.org/z/oarxM4qzs

А падает наверное, потому что функции выше текущей тоже тратят стек. И когда вызывается эта функция, то стек уже закончился. Или там рекурсия где-то есть, или ещё что-нибудь.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Может быть и так, я поверил топикстартеру.

Legioner ★★★★★
()
Ответ на: комментарий от fsb4000

А падает наверное, потому что функции выше текущей тоже тратят стек. И когда вызывается эта функция, то стек уже закончился. Или там рекурсия где-то есть, или ещё что-нибудь.

да падает у меня мой код, в минимальном примере не падает очевидно

но да падает только при сборке gcc 9.2

как ты описал - много другого кода который может уменьшает размер стека

svv20624
() автор топика
Ответ на: комментарий от anonymous

Эти анонимные балаболы. Во-первых - там вла только потому, что он не засунул свои w/h в енум и в сишке нет const.

Во-вторых, эта нелепая бездарная чушь про «нельзя узнать сколько осталось». Никогда нельзя узнать сколько осталось места в стеке вне зависимости от того вла там, либо нет. Обнови методичку.

nonedi18
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.