【问题标题】:Warning: Expected ‘int **’ but argument is of type ‘int (*)[(sizetype)(n)]’ [duplicate]警告:预期为“int **”,但参数类型为“int (*)[(sizetype)(n)]”[重复]
【发布时间】:2013-12-16 08:22:17
【问题描述】:

以下代码:

#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) {

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

【问题讨论】:

  • 无法对数组进行变量初始化。编译器误解了 M.. 的类型。
  • @amdixon: You can now. 这里真正的问题是二维数组既不是指向指针的指针,也不兼容需要指向指针的函数。
  • 这个有很多重复项。我去挖……
  • 再一次...... 数组不是没有指针!
  • @amdixon: this code 工作正常

标签: c


【解决方案1】:

这段代码有两个问题。首先,您将int (*)[(sizetype)(n)] 的参数(指向n 整数数组的指针,这是您将二维数组M 传递给函数时衰减到的类型)传递给期望@ 参数的函数987654324@。永远记住数组不是指针。一种可能的解决方案是您可以将函数的第一个参数更改为 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) {

【讨论】:

    【解决方案2】:

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

    第一个是指向int *(数组的第一个元素)的指针,第二个是指向给定长度的数组的指针。

    比较两者在内存中的含义以及为什么不能以这种方式工作。

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

    【讨论】:

      【解决方案3】:

      你应该知道int a[][]int **a不同,第一个a和int(*a)[]是一样的,表示指向数组的指针;如果你想用@表示一个二维数组987654325@,请参考:C Programming: Initialize a 2D array of with numbers 1, 2, 3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 2021-07-09
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        相关资源
        最近更新 更多