Como se dice, se le dan 8 mb de pila a cada proceso. Esta pila se utilizará para almacenar variables locales. Entonces, si tomo una matriz de tamaño máximo que la pila, ¿debe desbordarse?
int main() { int arr[88388608]; int arr1[88388608]; int arr2[88388608]; while(1); return 0; }¡Pero no puedo obtener el resultado!
¡Bienvenido al mundo de la optimización de compiladores!
Debido a la regla como si, el compilador solo necesita construir algo que tenga los mismos resultados observables que su código original. Así que el compilador es libre de:
Si desea observar el desbordamiento de la pila (el malo, no nuestro buen sitio :-)), debe:
El siguiente código hace SIGSEGV con CLang 3.4.1 cuando se compila como cc -g foo.c -o foo
#include <stdio.h> #define SIZE 88388608 void fill(int *arr, size_t size, int val) { for (size_t i=0; i<size; i++) { arr[i] = val; } } int main() { int arr[SIZE]; int arr1[SIZE]; int arr2[SIZE]; fill(arr, SIZE, 0); fill(arr1, SIZE, 0); fill(arr2, SIZE, 0); printf("%d %d %d\n", arr[12], arr1[15], arr2[18]); return 0; } e incluso este código funciona bien cuando se compila como nivel de optimización -O2 ... Los compiladores ahora son demasiado inteligentes para mí, y no soy lo suficientemente valiente como para mirar detenidamente el código ensamblador, que sería la única forma real de entender lo que realmente es ¡ejecutado!