警告:预期'int **'但参数类型为'int(*)[(sizetype)(n)]'

时间:2013-11-30 07:04:50

标签: c

以下代码:

#include <stdio.h>

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 <= row2; i++)
    printf("%d ", M[i][col2]);
  for (i = col2; 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) {

我第一次看到这个警告。这是什么意思?

3 个答案:

答案 0 :(得分:10)

此代码存在两个问题。首先,您传递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。可以通过将nmain传递到您的函数来解决此问题,从而将您的函数定义更改为

void printSpiral(int n, int (*M)[n], int row1, int row2, int col1, int col2) {

答案 1 :(得分:2)

编译器想告诉您函数需要int **,但是为它提供类型为int (*)[(sizetype)(n)]的参数。

第一个是指向({1}}数组的第一个元素的指针,第二个是指向给定长度的数组/数组的指针。

比较记忆中的两种意义以及为什么这种方法无法正常工作。

解决方案是为函数提供指向一个元素的指针,至少是总列数。 (如果您希望函数执行边界检查,它也需要行数。)然后您必须手动计算索引。

答案 2 :(得分:0)

你应该知道int a[][]int **a不同,第一个a与int(* a)[]相同,这意味着一个指向数组的指针;如果你想按int **a表示二维数组,请参考:C Programming: Initialize a 2D array of with numbers 1, 2, 3