¿Por qué obtengo un segfault en C de declarar una matriz grande en la stack?

Obtengo un segfault de esta línea de código:

int fatblob[1820][286][5]; 

¿Porqué es eso?

Está intentando asignar 1820 * 285 * 5 * sizeof(int) bytes = aproximadamente 10MB (si sizeof(int) == 4 ). Probablemente, es más bytes que los que su sistema operativo le da para la asignación de stack de forma predeterminada, por lo que obtiene un desbordamiento / segfault de stack.

Puede solucionar este problema solicitando una stack adicional al crear el subproceso, asignando en el montón o cambiando los valores predeterminados del sistema operativo.

Debido a que su segmento de stack es más pequeño que 1820*285*5 int s. Por lo general es en un barrio de 1 MB.

Porque la stack se desborda. Trate de asignar esa matriz en el montón.

 int fatblob[1820][286][5]; 

está intentando asignar una ubicación de memoria de 180 * 286 * 5 * 4 (tamaño de int = 4) que es de alrededor de 9.8 MB, por lo que existe la posibilidad de tener un tamaño de stack predeterminado menor en su sistema operativo.

LINUX tiene 8192 KB (es decir, 8 MB) de tamaño de stack. Por lo tanto, obviamente obtendrá un desbordamiento de stack si está tratando de asignar más memoria en la stack.

Puedes intentar cambiar el tamaño de stack de tu sistema operativo. En LINUX puedes probar ulimit

ulimit -s

me gusta

$ ulimit -s 1024

Espero que te ayude.

Las variables automáticas (el tipo predeterminado) en C normalmente se asignan en la stack. La stack es una región de memoria asignada por subproceso, y aunque puede crecer en muchos sistemas operativos, siempre tiene un tamaño limitado. La respuesta de danben cubre la stack predeterminada bastante bien, pero si está utilizando subprocesos, está asignando nuevos en la creación de subprocesos (por ejemplo, pthread_attr_setstacksize). En general, las asignaciones grandes se hacen mejor en el montón (malloc / new), pero incluso eso puede ser demasiado pequeño a veces. mmap () o similar a veces ayuda entonces.

¿A dónde fue la respuesta de Daniel? Se vinculó a alguna información sobre los límites de stack .