ce qui cause une erreur de segmentation dans le programme ci-dessous

Si je garde la valeur des lignes à 100000, le programme fonctionne bien, mais si je crée des lignes d’un million de dollars sous 1 000 000 000, le programme me donne l’erreur de segmentation. Quelle est la raison? J’exécute ci-dessous le kernel Linux 2.6x RHEL.

#include #define ROWS 1000000 #define COLS 4 int main(int args, char ** argv) { int masortingx[ROWS][COLS]; for(int col=0;col<COLS;col++) for(int row=0;row < ROWS; row++) matrix[row][col] = row*col; return 0; } 

La masortingx est une variable locale dans votre fonction main . Donc, il est “alloué” sur la stack d’appels de la machine.

Cette stack a quelques limites.

Vous devez faire de votre masortingx une variable globale ou static ou en faire un pointeur et allouer la stack (avec calloc ou malloc par exemple) à la zone mémoire. N’oubliez pas que calloc ou malloc peuvent échouer (en retournant NULL).

Une meilleure raison d’allouer une telle chose est que les dimensions de la masortingce doivent être réellement une variable ou une entrée. Il y a peu de raisons de câbler les dimensions dans le code source.

Heuristique: n’a pas de cadre local (sum cumulée de la taille des variables locales) supérieur à un ou deux kilo-octets.

[bien sûr, il y a des exceptions valables à cette heuristique]

Vous allouez une variable de stack, la stack de chaque programme est limitée.

Lorsque vous essayez d’allouer trop de mémoire de stack, votre kernel va tuer votre programme en lui envoyant un signal SEGV, autrement dit une erreur de segmentation.

Si vous souhaitez allouer de plus gros morceaux de mémoire, utilisez malloc , cette fonction obtiendra de la mémoire du tas.

Votre système ne doit pas vous permettre de faire une allocation de stack aussi grande. Rendre la masortingx globale ou utiliser l’allocation dynamic (via malloc et free ) et tout devrait bien se passer.