Pourquoi ai-je un segfault en C en déclarant un grand tableau sur la stack?

Je reçois un segfault de cette ligne de code:

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

Pourquoi donc?

Vous essayez d’allouer 1820 * 285 * 5 * sizeof(int) octets = environ 10 Mo (si sizeof(int) == 4 ). C’est probablement plus d’octets que ce que votre système d’exploitation vous a atsortingbué pour l’allocation de stack par défaut, vous obtenez donc un dépassement de capacité de stack / segfault.

Vous pouvez résoudre ce problème en demandant une stack supplémentaire lors de la création du thread, en allouant sur le tas ou en modifiant les valeurs par défaut du système d’exploitation.

Parce que votre segment de stack est plus petit que 1820*285*5 int s. C’est généralement dans un quartier de 1MB.

Parce que la stack déborde. Essayez d’allouer ce tableau sur le tas.

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

vous essayez d’allouer un emplacement mémoire d’environ 180 * 286 * 5 * 4 (soit la taille de int = 4), qui est d’environ 9,8 Mo; il est donc possible que la taille de la stack par défaut soit inférieure.

LINUX a 8192 Ko (soit 8 Mo) de taille de stack. Donc, évidemment, vous allez avoir un dépassement de capacité de la stack si vous essayez d’allouer plus de mémoire sur la stack.

Vous pouvez essayer de changer la taille de la stack de votre système d’exploitation. Dans LINUX, vous pouvez essayer ulimit

ulimit -s

comme

$ ulimit -s 1024

J’espère que cela vous aidera.

Les variables automatiques (le type par défaut) en C sont généralement allouées sur la stack. La stack est une région de mémoire allouée par thread et, même si elle peut croître sur de nombreux systèmes d’exploitation, sa taille est toujours limitée. La réponse de danben couvre assez bien la stack par défaut, mais si vous utilisez des threads, vous en affectez de nouveaux lors de la création de threads (par exemple, pthread_attr_setstacksize). En général, les allocations importantes sont mieux effectuées sur le tas (malloc / new), mais même cela peut parfois être trop petit. mmap () ou similaire peut parfois aider.

Où est passée la réponse de Danben? Il est lié à certaines informations sur les limites de la stack .