这是我的代码,我遇到了分段错误,我不知道为什么......
我正在创建一个<android.support.v7.widget.AppCompatRadioButton
android:id="@+id/radio_bronze_monthly"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onBillingRadioButtonClicked"
android:text="@string/bronze_monthly"
android:textColor="@color/black"
android:textSize="@dimen/default_text_size"
app:buttonTint="@color/black"
app:colorAccent="@color/black"
app:colorPrimary="@color/black"
app:colorPrimaryDark="@color/black"/>
是其大小的网格,n
是一个数组,其类型是cellule:一个单元格有2个值。所以我在函数tab
中创建了一个数组creer_grille
它(大小可以是4 6或8)并且我用-1和0初始化单元格值。然后在下面的函数中我' m测试malloc
函数。
creer_grille
答案 0 :(得分:3)
g->n = n;
这是访问未经授权的值 - 在您的代码中调用Undefined Behavior。使用malloc
分配后将行移至。
同样g = malloc(sizeof(int) * (n*n));
是错误的,您不希望grille*
指向为int
分配的块。因为如果没有足够的内存,将会有未定义的行为从你的分配中获取内存。
g = malloc(sizeof(*g) * (n));
由于您已分配n*n
位置以存储grille
,因此您应通过编制索引来访问它们
for (i = 0; i < n; i++)
{
// for some x
g[i].tab[x].val = -1;
g[i].tab[x].initial = 0;
}
再次g->tab[i].val = -1;
这是错误的,因为前面提到的原因相同。您必须将内存分配给g[i].tab
。否则它是未定义的行为。您必须为g[i].tab
分配内存。
g[i].tab = malloc(sizeof *g[i].tab * someSize);
你的逻辑也存在缺陷。首先,分配nxn
内存并不意味着您拥有nxn
网格。您遵循的方法将为您提供一个连续的nxn
元素块,这些元素将不会被使用。 (你可以利用它,但那是一种矫枉过正的行为)。
你能做的最好的事情就是锯齿状阵列,这里展示了它的例子。
示例代码: -
grille *creer_grille(int n)
{
grille *g;
g = malloc(sizeof *g * n);
if( g == NULL){
fprintf(stderr,"%s\n","Error in malloc");
exit(1);
}
for (size_t i = 0; i < n; i++)
{
g[i].tab = malloc(sizeof *g[i].tab * n);
if( g[i].tab == NULL){
fprintf(stderr, "%s\n", "Error in malloc");
exit(1);
}
g[i].n = n;
for(size_t j = 0; j < n; j++){
g[i].tab[j].val = -1;
g[i].tab[j].initial = 0;
}
}
return g;
}
完成操作后,您必须free
动态分配的内存。 free
逻辑类似于 - 您将首先释放tab
中分配的内存,然后在释放所有内存后,您将释放g
中分配的内存。