我无法使用动态 2D 数组和指针编译 C 文件



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

编译时收到此警告:

c1.c:24:12:警告:从不兼容的指针类型>[-Win兼容指针类型] 分配 copieTab = tabClef;

显然copieTabtabClef不兼容,因此无法分配其值。

我创建了一个包含 3 行和 100 列的动态 2D 数组。这是我的代码:

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 echouen");
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;
}

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

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

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

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

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

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

其他功能:

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

像使用它一样

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

    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*

最新更新