为什么以下代码会出现段错误?
#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);
}
似乎 scanf
和 printf
语句没有获取传入的正确数据类型,但我无法弄清楚它们是什么应该是。
如何更改它才能正常工作?
最佳答案
这声明了一个 MAXROWS
数组,这些数组由指向 int
的指针组成。
int *data[MAXROWS][MAXCOLS];
但是,在函数定义中,顶级数组(任何大小)等同于指针,因为数组在传递给函数时总是衰减为指向数组成员类型的指针。
所以你的函数定义相当于:
void getInput (int *(*data)[MAXCOLS])
即指向 MAXCOLS
指针数组的指针,这些指针指向 int
。
就您的代码而言,您永远不会初始化数组中的任何 int
指针,因为您将 int
的二维数组作为指向 2d 的指针传递int *
数组。
您可能想要传递的是一个指向 MAXCOLS
int
数组的指针:
void getInput (int (*data)[MAXCOLS])
或等效的:
void getInput (int data[][MAXCOLS])
然后执行以下操作:
int main(void)
{
int data[MAXROWS][MAXCOLS];
getInput(data);
return 0;
}
然后,您将二维数组作为指向其第一个元素的指针(指向行或 MAXCOLS
int
数组的指针)。
如果您确定要更改,请务必更改:
scanf ("%d", data[curRow][curCol]);
printf ("%d\n", *data[curRow][curCol]);
至:
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
此外,请在此处检查您的参数:
scanf ("%d %d", &rows, &cols);
您需要传递指向行
和列
的指针。
确保为您的输入函数添加一些边界检查,这样您就不会尝试读取比 MAXROWS
或 MAXCOLS
更多的行和列。
关于c - 如何修改传递给函数的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431500/