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语句没有得到正确的数据类型传入,但我无法弄清楚它们应该是什么。
如何更改它以使其正常工作?
这声明了一个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)
您需要将指针传递给rows和cols。
确保为您的输入函数添加一些边界检查,这样您就不会尝试读取比MAXROWSor多的行和列MAXCOLS。
| 归档时间: |
|
| 查看次数: |
9660 次 |
| 最近记录: |