我具有以下签名的功能:
void Box_sort(int**,int,int)
和以下类型的变量:
int Boxes[MAX_BoxES][MAX_DIMENSIONALITY+1]
当我打电话的功能
Box_sort(Boxes,a,b)
海湾合作委员会给我两个警告:
103.c:79: warning: passing argument 1 of ‘Box_sort’ from incompatible pointer type (string where i am calling the function) 103.c:42: note: expected ‘int **’ but argument is of type ‘int (*)[11] (string where the function is defined)
问题是为什么? int x [] []和int ** x(和实际的int * x [])在C中不是相同的类型吗?
解决方法
我知道几天前几乎完全像这样的问题,现在找不到它.
答案是,int [size] [](参见底部的注释)和int **绝对不是相同的类型.在许多情况下,可以互换使用int []和int *,特别是在这种情况下,因为当将数组传递给函数时,数组会衰减到指向第一个元素的指针.但是对于二维阵列,这些方法是非常不同的存储方法.
这是它们在2×2阵列的内存中的外观:
int a[2][2]: __a[0][0]__|__a[0][1]__|__a[1][0]__|__a[1][1]__ (int) (int) (int) (int) int **a (e.g. dynamically allocated with nested mallocs) __a__ (int**) | v __a[0]__|__a[1]__ (int*) (int*) | | | | v ------------------> __a[0][0]__|__a[0][1]__ __a[1][0]__|__a[1][1]__ (int) (int) (int) (int)
你可以这样构建第二个:
int **a = malloc(2 * sizeof(int*)); a[0] = malloc(2 * sizeof(int)); a[1] = malloc(2 * sizeof(int));
注意:正如其他人所说,int [] []不是一个真正的类型;只有一个尺寸可以是未指定的.但这里的核心问题是二维数组和双指针是否相同.