【发布时间】:2019-08-09 05:18:01
【问题描述】:
我用 C 编写“将动态 2D 传递给函数”。
以下代码编译成功,运行良好。
void iter_2d(const int** arr,
const size_t row,
const size_t column) {
// ..some code
}
int main(){
const size_t column = 3, row = 4;
int** arr = (int**)malloc(sizeof(int*) * row);
for (size_t i = 0; i < row; i++)
arr[i] = (int*)malloc(sizeof(int) * column);
// init val for array
iter_2d(arr,row,column);
// clear array
}
但我收到警告:
t.c:24:11: warning: passing argument 1 of 'iter_2d' from incompatible pointer type [-Wincompatible-pointer-types]
iter_2d(arr,row,column);
^~~
t.c:4:26: note: expected 'const int **' but argument is of type 'int **'
void iter_2d(const int** arr,
~~~~~~~~~~~~^~~
我认为函数 iter_2d 只是迭代数组的值,不能在函数 iter_2d 中修改,
所以输入参数arr应该是const to pointer。
但是编译器告诉我这个警告让我很困惑。
【问题讨论】:
-
删除所有
consts。 -
制作指向指针的指针是制作二维数组的不好方法,因为它浪费空间和时间。如果您只能针对支持可变长度数组的 C 实现,那么只需执行
int (*arr)[column] = malloc(row * sizeof *arr);,并将函数声明更改为void iter_2d(size_t row, size_t column, const int (*arr)[column])。如果您必须针对可能不支持可变长度数组的 C 实现,那么您可以使用int的一维数组并编写自己的索引算法(二维r和c的平下标是@ 987654330@). -
此外,计算机供应商不再对空格字符收费,因此您可以将
iter_2d(arr,row,column);更改为iter_2d(arr, row, column);并进行其他更改以提高可读性。 -
我们需要一个规范的骗子来解决这个问题,这很常见。
-
与你的问题无关,你可能想看看Correctly allocating multi-dimensional arrays。
标签: c