为什么这会给我一个段错误?

时间:2017-12-09 13:26:40

标签: c arrays pointers segmentation-fault malloc

这是我的代码,我遇到了分段错误而且我不知道为什么......我正在创建一个网格,其中包含一个' n'是它的大小,' tab'是一个他的类型是cellule的数组:一个单元格有2个值。因此,我正在创建功能' creer_grille'一个数组我malloc它(大小可以是4 6或8)并且我用-1和0初始化单元格值。然后在下面的函数中我测试' creer_grille'功能

<img src="amp.jpg" alt="something">

3 个答案:

答案 0 :(得分:1)

creer_grille函数中,声明g指针。由于它没有初始化,它将包含垃圾。

以后几行,您尝试访问ng)的g->n成员。即使在这个时候,您的g指针也没有初始化。因此,您尝试访问垃圾位置,这显然会导致分段错误。

可能的解决方法是在使用g指针前为其分配内存。

g = malloc(sizeof(grille));

我怀疑您的编译器可能已经警告过您使用未初始化的变量。

答案 1 :(得分: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)Cellules也必须被释放(并且在格栅之前)

答案 2 :(得分:0)

问题出在这个函数中:creer_grille(int n) 变量g以sizeof(int) n n

的大小动态分配

但是在循环期间,您正在访问未明确分配的cellule字段。 你是分配g和测试(g-&gt; tab == NULL)。这适用于你,因为malloc没有将分配的内存设置为0.如果你使用calloc - 你可以看到问题。

当您尝试在第n * n次迭代中设置cullule中的初始字段时 - 您将得到分段错误。