Pourquoi est-ce que 248×248 est la taille de tableau bi-dimensionnelle maximale que je peux déclarer?

J’ai un problème de programme pour lequel je voudrais déclarer un tableau 256×256 en C. Malheureusement, chaque fois que j’essaie de déclarer un tableau de cette taille (entiers) et que je lance mon programme, il se termine de manière inattendue. Aucune suggestion? Je n’ai pas essayé d’allocation de mémoire car je n’arrive pas à comprendre comment cela fonctionne avec les tableaux multidimensionnels (n’hésitez pas à me guider, même si je suis novice en C). Une autre chose intéressante à noter est que je peux déclarer un tableau 248×248 en C sans aucun problème, mais pas plus grand.

dims = 256; int majormasortingx[dims][dims]; 

Compilé avec:

 gcc -msse2 -O3 -march=pentium4 -malign-double -funroll-loops -pipe -fomit-frame-pointer -W -Wall -o "SkyFall.exe" "SkyFall.c" 

J’utilise SciTE 323 (je ne sais pas comment vérifier la version de GCC).

Il y a trois endroits où vous pouvez allouer un tableau en C:

  • Dans la mémoire automatique (communément appelée “sur la stack”)
  • Dans la mémoire dynamic ( malloc / free ), ou
  • Dans la mémoire statique (mot clé static / espace global).

Seule la mémoire automatique a des contraintes quelque peu sévères sur la quantité d’allocation (c’est-à-dire, en plus des limites définies par le système d’exploitation); Les allocations dynamics et statiques peuvent potentiellement occuper presque autant d’espace que le système d’exploitation met à votre disposition.

Le moyen le plus simple de voir si tel est le cas est de déplacer la déclaration en dehors de votre fonction. Cela déplacerait votre tableau en mémoire statique. Si les plantages continuent, ils n’ont rien à voir avec la taille de votre tableau.

Sauf si vous utilisez une très ancienne machine / compilateur, il n’y a aucune raison qui devrait être trop grande. Il me semble que le problème est ailleurs. Essayez le code suivant et dites-moi si cela fonctionne:

 #include  int main() { int ints[256][256], i, j; i = j = 0; while (i<256) { while (j<256) { ints[i][j] = i*j; j++; } i++; j = 0; } printf("Made it :) \n"); return 0; } 

Vous ne pouvez pas nécessairement supposer que “se termine inopinément” est nécessairement directement à cause de “la déclaration d’un tableau 256×256”.

SUGGESTION:

1) Réduisez votre code en un exemple simple et autonome

2) l’exécuter dans le débogueur

3) lorsqu’il “se termine de manière inattendue”, utilisez le débogueur pour obtenir un “suivi de stack” – vous devez identifier la ligne en échec

4) Vous devriez également rechercher un message d’erreur spécifique (si possible)

5) Postez votre code, le message d’erreur et votre traceback

6) Assurez-vous également de nous indiquer la plate-forme (par exemple, Centos Linux 5.5) et le compilateur (par exemple, gcc 4.2.1) que vous utilisez.