我正在研究C语言和数据结构。我想详细解释为什么我们不能使用动态数组作为使用静态数组参数的函数的参数。
#include <stdio.h>
int sumAry2D_f1(int ary[][3], int rows, int cols);
void freeAry2D(int **ary, int rows);
int main(void)
{
int ary2D[][3] = { {1, 2, 3}, {4, 5, 6} }; // static array
int r, c;
int **ary = (int**)malloc(sizeof(int*) * 2); // dynamic array
for (r = 0; r < 2; r++)
ary[r] = (int*)malloc(sizeof(int)*3);
for (r = 0; r < 2; r++)
for (c = 0; c < 3; c++)
ary[r][c] = r + c; // 0, 1, 2, 1, 2, 3
printf("sumAry2D_f1() %d\n", sumAry2D_f1(ary2D, 2, 3));
// why we can`t function like this?
// printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3));
freeAry2D(ary, 2); // free function of dynamic array
return 0;
}
int sumAry2D_f1(int ary[][3], int rows, int cols)
{
int i, j, sum = 0;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
sum += ary[i][j];
return sum;
}
void freeAry2D(int **ary, int rows)
{
int i;
for (i = 0; i < rows; i++)
free(ary[i]);
free(ary);
}
答案 0 :(得分:0)
// why we can`t function like this?
// printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3));
您的函数特别期望指向指向3个整数序列的整数指针的指针,或3个元素整数数组的数组,而不仅仅是指向整数指针的指针。 ary
只是指向整数指针的指针。虽然您使int **
具有与int [][3]
相同的结构,但它可能不同,编译器无法分辨,因为内存分配在运行时发生,因此如果您取消注释代码它可能不会编译,即使它确实行为将是未定义的。
不幸的是,您需要2个功能来执行您想要的操作:
int sumAry2D_f1(int ary[][3], int rows, int cols);
和
int sumAry2D_f12(int** ary, int rows, int cols);
每个函数内的代码都是一样的。