这是我的代码,我遇到了分段错误而且我不知道为什么......我正在创建一个网格,其中包含一个' n'是它的大小,' tab'是一个他的类型是cellule的数组:一个单元格有2个值。因此,我正在创建功能' creer_grille'一个数组我malloc它(大小可以是4 6或8)并且我用-1和0初始化单元格值。然后在下面的函数中我测试' creer_grille'功能
<img src="amp.jpg" alt="something">
答案 0 :(得分:1)
在creer_grille
函数中,声明g
指针。由于它没有初始化,它将包含垃圾。
以后几行,您尝试访问n
(g
)的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);
}
解释
&&
的优先级高于||
sizeof(cellule)
而非sizeof(int)
答案 2 :(得分:0)
问题出在这个函数中:creer_grille(int n) 变量g以sizeof(int) n n
的大小动态分配但是在循环期间,您正在访问未明确分配的cellule字段。 你是分配g和测试(g-&gt; tab == NULL)。这适用于你,因为malloc没有将分配的内存设置为0.如果你使用calloc - 你可以看到问题。
当您尝试在第n * n次迭代中设置cullule中的初始字段时 - 您将得到分段错误。