【问题标题】:I cannot compile a C file with a dynamic 2D array and pointers我无法用动态二维数组和指针编译 C 文件
【发布时间】:2018-01-05 20:49:59
【问题描述】:

编辑: 是的,我知道我已经有了一个 3x100 数组,而无需执行所有这些操作。但问题是我不知道数组的大小,它会根据情况而变化。这就是我想让它动态化的原因。

编译时收到此警告:

c1.c:24:12: 警告:来自不兼容指针类型的赋值 >[-Wincompatible-pointer-types] copyTab = tabClef;

显然 copieTabtabClef 不兼容,因此无法为其赋值。

我创建了一个具有 3 行和 100 列的动态二维数组。这是我的代码:

void allocation(size_t longClef, int copieTab[3][100]) {
  int i=0;
  int ** tabClef = NULL;
  tabClef = malloc(longClef * sizeof(char));

  if (tabClef == NULL) //Si l'allocation a echoue
  {
    printf("Allocation a echoue\n");
    return; // On arrete immediatement le programme
  }
  // On peut continuer le programme normalement sinon

  // Creer matrice
  for (i=0; i<longClef; i++) {
    tabClef[i] = malloc(100 * sizeof(char));
  }

  /* Copie du tableau dans un pointeur pour le sortir de la fonction */
  copieTab = tabClef;
}

【问题讨论】:

  • 您不能将分配的指针列表分配给二维数组。为什么不直接写copieTab
  • 请注意,您的指针/数组元素类型是int,并且您为两者分配了错误的大小。应该分别是sizeof(int *)sizeof(int)

标签: c arrays pointers malloc


【解决方案1】:

问题是我不知道数组的大小

OP 的代码是一个不错的尝试,但非常不适合分配 2D 动态大小的数组。

分配rowint *指针数组。
row次,分配colint数组。
从第一步返回指针。

int **alloc_2D_dynamic_int(size_t row, size_t col) {
  int **table = malloc(sizeof *table * row);
  if (table == NULL) Oops();  // TBD error handling
  for (size_t r = 0; r < row; r++) {
    table[r] = malloc(sizeof *(table[r]) * col);
    if (table[r] == NULL) Oops();
  }
  return table;
}

释放时,反转步骤。

void free_2D_dynamic_int(int **table, size_t row) {
  if (table) {
    for (size_t r = 0; r < row; r++) {
      free(table[r]);
    }
    free(table);     
  }
}

否则 OP 可能想要为 2D 数组分配内存

void alloc_2D_int(size_t row, size_t col, int (**table)[row][col]) {
  *table = malloc(sizeof(**table));
}

或者返回分配的指针

void *alloc_2D_int_R(size_t row, size_t col) {
  int (*table)[row][col] = malloc(sizeof *table);
  return table;
}

【讨论】:

    【解决方案2】:

    不,你不能那样做。一个二维数组衰减为指向第一个元素的指针 - 这里它 (copieTab) 的类型将是 int(*)[100] 并且您正在为其分配 int** 的值。这就是编译器消息的原因。

    有几个选项可以摆脱这种情况:-

    1. 从函数返回动态分配的内存地址并将其分配给int**

       int** a;
       a = allocation(2);
       ...
      

    其他功能:

          int ** allocation (size_t sz){
             ..
             return tabClef;
          }
    

    像这样使用它

         printf("%d",a[i][j]);    
    
    1. 或者,如果它已经是int 的二维数组,那么您只需将其单独传递给函数以获取输入。无需动态分配。

      int row;
      //get input in row.
      int a[row][100]; // Variable length array.
      ...
      func(row,a);
      

    功能:

        void func(int row, int a[][100]){
        ...// work with 'a' here. You can make changes to it.
        }
    
    1. 或将int** 传递给分配函数,然后对其进行更改。 (要求您使用 3 级指针 - 不推荐)。

    除了错误的内存分配量 - 您在第二次分配时没有检查 malloc 的返回值。

    还请注意,您说您正在动态创建大小为 3x100 的数组,但随后您分配了 longClef 数量的 int*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2014-03-06
      • 2021-08-22
      • 2011-12-11
      • 2014-12-31
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多