Вопрос сменился на: зачем ограничен размер стека, да еще и так низко?
Какой смысл ограничивать? (ну в теории понятно, что где-то есть граница между пространством стека и пулами фри мем, и однажды она может быть достигнута... в смысле - стек и фримем разростясь сойдутся в некой точке... но, гм, если ядро ограничивает стэк, то и за этой границей оно же надо понимать следит, и область стека тогда уж должна быть приложению гаранитирована-не-меньше, а не ограничена сверху? что я не понимаю?
Код: Выделить всё
#define SIZE 209600000
int main() {
int ii [SIZE];
int i;
for (i = 0; SIZE != i; ++ i) ii [i] = i;
return 0;
}
Код: Выделить всё
$ gcc -Wall zz-memtest.c
$ ./a.out
Segmentation fault
$ gcc -Wall -O zz-memtest.c
$ ./a.out
$ gcc -Wall -O1 zz-memtest.c
$ ./a.out
$ gcc -Wall -O2 zz-memtest.c
$ ./a.out
$ gcc -Wall -O3 zz-memtest.c
$ ./a.out
$ gcc -Wall zz-memtest.c
$ ./a.out
Segmentation fault
теперь то же самое, но SIZE уменьшили на два порядка - 2096000
Код: Выделить всё
$ gcc -Wall zz-memtest.c
$ ./a.out
теперь SIZE увеличили на 1000 - 2097000
Код: Выделить всё
$ gcc -Wall zz-memtest.c
$ ./a.out
Segmentation fault
$ gcc -Wall -O zz-memtest.c
$ ./a.out
$
$ gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)