Progtwigción en C, ¿por qué esta statement de matriz grande produce una falla de segmentación?

Este código produce un error de segmentación durante la statement de la matriz. Estoy confundido sobre por qué sucede esto. Intencionalmente seleccioné 2000000000 como valor porque está por debajo de 2 ^ 31 y puede caber en una variable entera.

int main() { int nums_size = 2000000000; int nums[nums_size]; int i; for(i = 0; i < nums_size; i++) { nums[i] = i; } return 0; } 

Bueno, para empezar, son dos mil millones de enteros. Si tiene un espacio de direcciones de 32 bits e int tiene un tamaño de cuatro bytes en su plataforma (típico para una plataforma de 32 bits), no puede almacenar tantos enteros, punto.

Aún así, solo tiene mucho espacio disponible para usted en la stack, que es donde se ubican las variables automáticas.

Si necesita una matriz realmente grande, debe asignar dinámicamente utilizando malloc() (y, si lo hace, asegúrese de liberarla usando free() cuando haya terminado con ella).

 int nums_size = 2000000000; int nums[nums_size]; 

No significa 2000000000 bytes de ints, significa 2000000000 elementos de tipo int, que en una plataforma de 32 bits significa que está consumiendo casi 8 GB de memoria, esto es imposible.

Estás asignando una matriz gigante en la stack. Prácticamente ningún comstackdor C / C ++ manejará eso correctamente.

Es posible que pueda salirse con la suya moviéndolo a los globales (que asignará el espacio estáticamente mapeando la memoria en el ejecutable en tiempo de comstackción), o cambiando a una matriz malloc ‘d.

Por supuesto, eso aún requiere MUCHA memoria de una sola vez, pero al menos los métodos que menciono evitarán una segfault inmediata .

Las variables locales se asignan en la stack. Hay un espacio de stack de cantidad fija (generalmente de 1 MB a 8 MB, varía según el sistema operativo) proporcionado a la aplicación. La regla general es usar malloc () para asignar grandes cantidades de datos.

La respuesta a tu pregunta es simple: stackoverflow . No, no, no el sitio, sino el proceso real de “desbordamiento de la stack”. No tienes suficiente stack para almacenar esa matriz. Tan sencillo como eso. Hacer esto en sistemas con memoria limitada es pura locura. También vea esta pregunta .

Esta versión funciona bien en mi PC:

 const int nums_size = 2000000000; int nums[nums_size]; int main() { int i; for(i = 0; i < nums_size; i++) { nums[i] = i; } return 0; } 

(Bien, seamos honestos. Empieza bien, pero pronto va a intercambio).