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

标签 c arrays function 2d

为什么以下代码会出现段错误?

#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);
}

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

如何更改它才能正常工作?

最佳答案

这声明了一个 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);

您需要传递指向的指针。

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

关于c - 如何修改传递给函数的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431500/

相关文章:

c++ - 将 unique_ptr 传递给 strtok

c - 当进程 fork 时,共享库 .so 是否仍在地址空间中?构造函数会再次执行吗?

arrays - 如果 fetchrow_array 没有返回行,如何将数组分配给默认值

arrays - 如何在 NSUserDefault swift 中保存/检索嵌套字典?

java - Scala - 具有简单功能的 java.lang.VerifyError

c - 使用带有指针的嵌套结构

c++ - 检测对范围外变量的访问

c++ - 将文件中的数据读取到类的数组中

r - 如何在R函数中将对象导出到并行集群

python - 怀疑函数顺序/while 循环会导致游戏失败