如何修改传递给函数的二维数组?

Joe*_*ggs 1 c arrays 2d function

为什么下面的代码给我一个分段错误?

#define MAXROWS 10
#define MAXCOLS 10
void getInput (int *data[MAXROWS][MAXCOLS]) {
  int rows, cols;
  int curRow, curCol;
  printf ("How many rows and cols?");
  scanf ("%d %d", rows, cols);

  for (curRow = 0; curRow < rows; curRow++) {
    for (curCol = 0; curCol < cols; curCol++) {
      scanf ("%d", data[curRow][curCol]);
      printf ("%d\n", *data[curRow][curCol]);
    }
  }
}

void main () {
  int data[MAXROWS][MAXCOLS];

  getInput (data);
}
Run Code Online (Sandbox Code Playgroud)

似乎scanfandprintf语句没有得到正确的数据类型传入,但我无法弄清楚它们应该是什么。

如何更改它以使其正常工作?

CB *_*ley 5

这声明了一个MAXROWS指向 的指针数组的数组int

int *data[MAXROWS][MAXCOLS];
Run Code Online (Sandbox Code Playgroud)

但是,在函数定义中,顶级数组(任何大小)等效于指针,因为在传递给函数时,数组总是衰减为指向数组成员类型的指针。

所以你的函数定义相当于:

void getInput (int *(*data)[MAXCOLS])
Run Code Online (Sandbox Code Playgroud)

即指向指向的指针数组的MAXCOLS指针int

就您的代码而言,您永远不会初始化int数组中的任何指针,因为您将ints的二维数组作为指向int *.

您可能想要传递的是一个指向以下数组的指针MAXCOLS int

void getInput (int (*data)[MAXCOLS])
Run Code Online (Sandbox Code Playgroud)

或等效地:

void getInput (int data[][MAXCOLS])
Run Code Online (Sandbox Code Playgroud)

然后您执行以下操作:

int main(void)
{
    int data[MAXROWS][MAXCOLS];

    getInput(data);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,您将 2d 数组作为指向其第一个元素的指针(指向行或MAXCOLS ints数组的指针)传递。

如果您确定更改,请务必更改:

  scanf ("%d", data[curRow][curCol]);
  printf ("%d\n", *data[curRow][curCol]);
Run Code Online (Sandbox Code Playgroud)

到:

  scanf ("%d", &data[curRow][curCol]);
  printf ("%d\n", data[curRow][curCol]);
Run Code Online (Sandbox Code Playgroud)

另外,请在此处检查您的参数:

scanf ("%d %d", &rows, &cols);
Run Code Online (Sandbox Code Playgroud)

您需要将指针传递给rowscols

确保为您的输入函数添加一些边界检查,这样您就不会尝试读取比MAXROWSor多的行和列MAXCOLS