我无法编译带有动态2D数组和指针的C文件

我无法编译带有动态2D数组和指针的C文件,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,编辑:是的,我知道我已经有了一个3x100阵列,而不需要做所有这些。但问题是,我不知道数组的大小,它会根据情况而变化。这就是为什么我想让它充满活力 我在编译时收到以下警告: c1.c:24:12:警告:来自不兼容指针类型的赋值>[-Wincompatible指针类型] copieTab=tabClef 显然,copieTab与tabClef不兼容,因此无法指定其值 我创建了一个包含3行和100列的动态二维数组。这是我的密码: void allocation(size_t longClef, in

编辑:是的,我知道我已经有了一个3x100阵列,而不需要做所有这些。但问题是,我不知道数组的大小,它会根据情况而变化。这就是为什么我想让它充满活力

我在编译时收到以下警告:

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

显然,copieTab与tabClef不兼容,因此无法指定其值

我创建了一个包含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;
}
void分配(size\u t longClef,int copieTab[3][100]){
int i=0;
int**tabClef=NULL;
tabClef=malloc(longClef*sizeof(char));
if(tabClef==NULL)//Si l'a echoue
{
printf(“分配一个echoue\n”);
return;//关于欠费即时支付的le程序
}
//关于peut-continuer-le-program-normalement-sinon
//克里尔矩阵

对于(i=0;i不,您不能这样做。2d数组衰减为指向第一个元素的指针-在这里它(
copieTab
)的类型将是
int(*)[100]
,您将
int**
的值分配给它。这就是编译器消息的原因

有两种方法可以解决此问题:-

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

     int** a;
     a = allocation(2);
     ...
    
  • 其他职能:

          int ** allocation (size_t sz){
             ..
             return tabClef;
          }
    
    像这样使用它

         printf("%d",a[i][j]);    
    
  • 或者,如果它已经是一个2d数组
    int
    ,那么您只需将函数单独传递给它即可获得输入,无需动态分配

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

  • 或者将
    int**
    传递给分配函数,然后对其进行更改。(要求您使用3级指针-不推荐)
  • 除了错误的内存分配量之外-您在第二次分配时没有检查
    malloc
    的返回值

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

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

    OP的代码是一个很好的尝试,但并不适合分配一个动态大小的2D数组

    分配一个
    int*
    指针数组。
    次,分配一个
    列的数组
    int

    从第一步返回指针

    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 *alloc_2D_int_R(size_t row, size_t col) {
      int (*table)[row][col] = malloc(sizeof *table);
      return table;
    }
    

    无法将分配的指针列表分配给2D数组。为什么不直接在
    copieTab
    中写入?请注意,指针/数组元素类型为
    int
    ,并且为这两个元素分配了错误的大小。应分别为
    sizeof(int*)
    sizeof(int)
    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);     
      }
    }
    
    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;
    }