警告:预期’int **’但参数的类型为’int(*)’
以下代码:
#include void printSpiral(int **M, int row1, int row2, int col1, int col2) { if (!((row1 <= row2) && (col1 <= col2))) return; int i; for (i = col1; i <= col2; i++) printf("%d ", M[row1][i]); for (i = row1; i = col1; i--) printf("%d ",M[row2][i]); for (i = row2; i >= row1; i--) printf("%d ",M[i][col1]); printSpiral(M,row1+1,row2-2,col1+1,col2-1); } int main() { int n; scanf("%d",&n); int M[n][n]; int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) scanf("%d",&M[i][j]); printSpiral(M,0,n-1,0,n-1); return 0; }
发出以下警告:
spiral.c: In function 'main': spiral.c:26:3: warning: passing argument 1 of 'printSpiral' from incompatible pointer type [enabled by default] printSpiral(M,0,n-1,0,n-1);` spiral.c:3:6: note: `expected 'int **' but argument is of type 'int (*)[(sizetype)(n)]'` void printSpiral(int **M, int row1, int row2, int col1, int col2) {
我第一次看到这个警告。 这是什么意思?
这段代码有两个问题。 首先,你传递int (*)[(sizetype)(n)]
(指向n
整数数组的指针,这是你将2D数组M
传递给函数时衰减的类型)到你的函数,这是期待int **
的争论。 永远记住数组不是指针 。 一种可能的解决方案是您可以将函数的第一个参数更改为int (*)[(sizetype)(n)]
类型。
void printSpiral(int (*M)[n], int row1, int row2, int col1, int col2) {
但是通过这样做,第二个问题将会浮出水面,因为你将M
声明为可变长度数组,并且n
不知道n
。 通过将n
从main
传递给函数可以解决此问题,从而将函数定义更改为
void printSpiral(int n, int (*M)[n], int row1, int row2, int col1, int col2) {
编译器想告诉你函数需要一个int **
,但你提供了一个int (*)[(sizetype)(n)]
类型的参数。
第一个是指向(*的第一个元素) int *
的指针,第二个是指向给定长度的数组/数组的指针。
比较内存中的两种方式以及为什么这不能以这种方式工作。
解决方案是为函数提供指向一个元素的指针和至少总列数。 (如果您希望函数执行边界检查,它也需要行数。)然后您必须手动计算索引。
你应该知道int a[][]
与int **a
不同,第一个a
与int(* a)[]相同,这意味着指向数组的指针;如果你想通过int **a
指示一个二维数组int **a
,请参考: C编程:初始化一个数字为1,2,3的二维数组