2009-11-20 14 views
2

Pourquoi si je change la taille de l'une des dimensions d'un tableau, j'obtiens une erreur d'exécution: "Segmentation Fault?". Exemple:Le tableau C-multidimensionnel provoque une erreur de segmentation (GCC)

#include <stdio.h> 
#define DIM 8 
int main(int argc, char **argv) 
{ 
    int a[3][3][3][3][3][3][3][3][3][3][DIM], 
     b; 
    a[1][1][1][1][1][1][1][1][1][1][1] = 2; 
    b=a[1][1][1][1][1][1][1][1][1][1][1]; 
    printf("%d \n",b); 
    return 0; 
} 

Si DIM est 8, il a généré aucune erreur d'exécution, mais juste si DIM est supérieur à 8, il provoque l'erreur d'exécution « Erreur de segmentation ». Pourquoi ???

Répondre

1
 
3*3*3*3*3*3*3*3*3*3*8 = 472392; 472392*4 /* sizeof (int) */ = 1889568 
3*3*3*3*3*3*3*3*3*3*9 = 531441; 531441*4 /* sizeof (int) */ = 2125764 

je suppose que votre pile est limitée à 2Mbytes

7

Presque certainement un dépassement de pile. Vous allouez, quoi, 3^10 * 9 * sizeof(int) octets! Utilisez int *a = (int*)malloc(N * sizeof(int)) à la place, où N est le nombre d'ints que vous voulez. Ensuite, vous pouvez simuler un tableau N-dimensionnel sur celui-ci.

Je vais vous expliquer comment simuler un tableau 2D sur un tableau 1D .. Dites qu'il a des lignes de largeur 10. Ensuite, vous accédez à la 5ème valeur sur la ligne trois en prenant a[10 * 2 + 5]. En général, vous faites a[width * (row - 1) + column].

Deuxième méthode. Vous pouvez allouer un tableau de pointeurs vers des pointeurs de ints:

int **a = (int**)malloc(rows * sizeof(int*)) 
for (int i=0; i<row; ++i) 
    a[i] = (int*)malloc(columns * sizeof(int)) 

... L'extension à d'autres dimensions à titre d'exercice pour le lecteur.

+0

mais je dois tableau 11 dimensions et C n'a pas nouvelle [] opérande – psihodelia

+0

Vous voulez dire utiliser malloc() - ceci est une question de C, pas C++. – Ant

+1

@Ant: désolé, corrigé. @Norma: pourquoi auriez-vous besoin de cela en premier lieu ?! Vous pouvez le simuler (j'ajouterai cela), ou utiliser un int ******* ... mais sérieusement, vous avez probablement un défaut de conception. – int3

1

La taille de votre tableau est 3^10 * 8 * sizeof (int). En supposant un 32 bits int, sizeof (int) est de quatre octets et la taille de votre tableau est:

3^10 * 8 * 4 = 1,889,568 bytes 

Donc, vous êtes pile est pas si grand et vous êtes débordant la pile.

Questions connexes