2017-12-09 27 views
-3

私のコードは、私はセグメンテーションフォールトを取得していると私は理由を知らない...私は 'n'は、サイズは、 'タブ'は彼のタイプがcelluleである配列ですグリッドを作成しています:セルには2つの値があります。だから、私は関数 'creer_grille'でmallocを作成しています(サイズは4 6または8です)。そして、-1と0でセルの値を初期化します。次に、次の関数で 'creer_grille'関数。あなたのcreer_grille機能でなぜこれは私にsegfaultを与えるのですか?

typedef struct 
{ 
    int val; 
    int initial; 
} cellule; 

typedef struct 
{ 
    cellule *tab; 
    int  n; 
} grille; 

grille *creer_grille(int n) 
{ 
    grille *g; 
    int i; 

    assert(n == 4 || n == 6 || n == 8 && "Taille de la grille différent de 4,6 ou 8"); 
    g->n = n; 
    g = malloc(sizeof(int) * (n*n)); 
     if (g->tab == NULL) 
       exit(-1); 
    for (i = 0; i < n*n; i++) 
     { 
     g->tab[i].val = -1; 
     g->tab[i].initial = 0; 
     } 
     return g; 
} 

void detruire_grille(grille * g) 
{ 
    free(g); 
} 

void test_creer_grille(){ 
    int i,k; 
    for(k = 4; k <= 8 ; k+=2){ 
     grille * g = creer_grille(k); 
     assert(g->n == k && "Problème dans le champ n de la grille"); 

     //Vérification que les cellules sont vides 
     for(i = 0 ; i < k * k ; i++){ 
      assert(g->tab[i].val == -1 && "Problème : cellule non vide !"); 
      assert(g->tab[i].initial == 0 && "Problème : cellule initiale !"); 
     } 
     detruire_grille(g); 
    } 
    printf("Test de la fonction creer_grille OK !\n"); 
} 

int main() 
{ 
    test_creer_grille(); 
} 

答えて

0

いくつかの問題があります。提案固定コード

grille *creer_grille(int n) 
{ 
    grille *g = malloc(sizeof(grille)); // A <=== Allocate Grille 
    int i; 

    assert((n == 4 || n == 6 || n == 8) // B <===() 
     && "Taille de la grille différent de 4,6 ou 8"); 
    g->n = n; 
    g->tab = malloc(sizeof(cellule) * (n*n)); // C <=== sizeof(cellule) 
    if (g->tab == NULL) 
     exit(-1); 
    for (i = 0; i < n*n; i++) 
    { 
     g->tab[i].val = -1; 
     g->tab[i].initial = 0; 
    } 
    return g; 
} 

void detruire_grille(grille * g) 
{ 
    free (g->tab); // D <=== free first the Cellules 
    free(g); 
} 

説明

  • A)グリル
  • B)括弧を割り当てる必要&&||
  • Cよりも優先度を有するために必要である)sizeof(cellule)なくsizeof(int)
  • を使用
  • D)セルも解放する必要があります(グリルの前に)
1

、あなたはgポインタを宣言します。それは初期化されていないので、それはゴミを含むでしょう。

少し後で、gg->n)のメンバーにアクセスしようとすると、nが表示されます。この時点でも、gポインタは初期化されていません。したがって、明確な理由からセグメンテーション違反につながるゴミの場所にアクセスしようとします。

ポインタを使用する前にgポインタのメモリを割り当てることができます。

g = malloc(sizeof(grille));

私はあなたのコンパイラが初期化されていない変数を使用してについてあなたに警告している疑いがあります。

0

問題は、この機能である:変数gを動的にはsizeof(int型)のサイズで割り当てられている creer_grille(int型n)はn個のn

しかしループ中にあなたがcelluleフィールドにアクセスしていますそれは明示的に割り当てられませんでした。 割り当てとテスト(g-> tab == NULL)です。 callocを使用した場合、mallocは割り当てられたメモリを0に設定していないので、これはうまく動作します。

n * n回目の反復でculluleの初期フィールドを設定しようとすると、セグメント化エラーが発生します。

関連する問題