C-为什么我要抓取



这是我的代码,我得到了一个分割错误,我不知道为什么...我正在创建一个n的网格,其大小是tab是一个数组,他的类型是Cellule:单元格具有2个值。因此,我在函数creer_grille中创建阵列i malloc it(大小可以是4 6或8),并且用-1和0初始化单元格值。然后,在以下函数中,我正在测试creer_grille函数。

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();
}

g->n = n;

这是访问未有才能的价值 - 在您的代码中调用未定义的行为。使用malloc分配后将行移动到。

也是g = malloc(sizeof(int) * (n*n));是错误的,您不希望grille*指向分配给int s的块。因为如果没有足够的内存,则会从您的分配中出现不确定的行为。

g = malloc(sizeof(*g) * (n));

当您分配了存储grillen*n位置时,应通过索引

访问它们
      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,"%sn","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, "%sn", "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;
}

完成后,您必须将动态分配的内存freefree逻辑将是类似的 - 您将首先释放tab中分配的内存,然后在所有这些内存释放后,您将在g中免费分配内存。

相关内容

  • 没有找到相关文章

最新更新