2011-12-19 4 views
2

Il existe une erreur de segmentation bizarre. Le code suivant fonctionne très bienErreur de segmentation avec le tableau 2D

#include <stdlib.h> 
#include <stdio.h> 
main() 
    { 
    int matrixSize = 1000; 
    int i,j; 

    double a[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      a[i][j] = rand() % 10; 

     double b[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      b[i][j] = rand() % 10; 
    return 0; 
} 

Mais lorsque je tente d'initialiser un tableau 2D plus, je reçois exception "défaut de segmentation":

#include <stdlib.h> 
#include <stdio.h> 
main() 
{ 
    int matrixSize = 1000; 
    int i,j; 

    double a[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      a[i][j] = rand() % 10; 

    double b[matrixSize][matrixSize]; 
    for (i = 0; i < matrixSize; i++) 
     for (j = 0; j < matrixSize; j++) 
      b[i][j] = rand() % 10; 

    return 0; 
} 

Quelle est la cause potentielle?

+6

Les deux exemples de code sont identiques. – kennytm

+0

pourquoi est-ce marqué comme C++? – shuttle87

+0

J'ai supprimé la balise C++. – tpg2114

Répondre

10

Vous dépassez la taille de la pile la plus probable.

Dans le terminal que vous utilisez pour exécuter cette commande, essayez de taper

ulimit -s unlimited

et re-run, vous êtes sur un présumez système Linux en utilisant bash (ou sh). Si vous devez utiliser des tableaux de cette taille, vous pouvez les rendre dynamiques afin qu'ils soient sur le tas plutôt que sur la pile si la modification de la taille de la pile est problématique pour une raison ou pour une autre.

0

Comme l'indique tpg2114, l'allocation de grandes matrices n'est pas une bonne idée. Le plus facile est d'allouer comme ça

double (*a)[matrixSize] = malloc(sizeof(double[matrixSize][matrixSize])); 
. 
free(a); 

Ensuite, vous pouvez continuer à utiliser vos boucles imbriquées for pour l'initialisation sans problème comme avant.

NB:

  • puisque vous utilisez une variable pour les dimensions de votre matrice est techniquement un tableau de longueur variable, qui est disponible uniquement avec C99
  • votre définition pour main ne se conforme pas à la norme. Dans votre cas, vous devez utiliser int main(void) { ... }. Puisqu'un compilateur conforme devrait capturer ceci, il semble que vous n'utilisiez pas les bonnes options pour votre compilateur ou que vous ignoriez les avertissements qu'il vous donne.
  • car ils représentent la taille, vos variables matrixSize, i et j doit être de type size_t et non int.