为什么我会出现段错误?

时间:2017-12-09 11:49:25

标签: c arrays pointers segmentation-fault malloc

这是我的代码,我遇到了分段错误,我不知道为什么...... 我正在创建一个<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

1 个答案:

答案 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中分配的内存。