为什么 scanf 没有将整数存储在正确的数组位置?

0 c arrays multidimensional-array dynamic-memory-allocation

我正在创建一个动态分配的二维 int 数组,并尝试使用 scanf 直接读取用户输入,但这无法正常工作。第一次读取是正确的,并将用户输入的值存储在 [0][0] 处,但第二次读取将值存储在 [1][0] 而不是 [0][1] 处,第三次及后续读取则不正确。 t 将值存储在数组中的任何位置(我猜最终会出现在边界之外的随机内存中?)。索引似乎是错误的,但我已经仔细检查过它们,并且可以在调试器中看到它们的正确值。

#include <stdio.h>
#include <stdlib.h>

#define ROW_SIZE 2
#define COL_SIZE 6

typedef int myMatrix[ROW_SIZE][COL_SIZE];

int main(void) {
  myMatrix *pMatrix = (myMatrix *)malloc(sizeof(int) * (ROW_SIZE * COL_SIZE));

  for (int i = 0; i < ROW_SIZE; ++i) {
    for (int j = 0; j < COL_SIZE; ++j) {
      printf("Enter row %d column %d: ", i, j);
      scanf("%d", pMatrix[i][j]);
    }
  }

  // Do stuff with matrix

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

如果我将用户输入读取到临时 int 中,然后将其写入取消引用的数组指针,则它可以正常工作:

  int temp = 0;
  for (int i = 0; i < ROW_SIZE; ++i) {
    for (int j = 0; j < COL_SIZE; ++j) {
      printf("Enter row %d column %d: ", i, j);
      scanf("%d", &temp);
      (*pMatrix)[i][j] = temp;
    }
  }
Run Code Online (Sandbox Code Playgroud)

我对 scanf 和二维数组指针做错了什么?

438*_*427 6

pMatrix是一个指向二维数组的指针。

所以pMatrix[0]会带你到第一个分配的二维数组,

并将pMatrix[1]带您到第二个分配的二维数组,

并将pMatrix[2]带您到第三个分配的二维数组,

等等。

在您的代码中,您只分配一个二维数组,因此访问pMatrix[1], pMatrix[2], ... 是非法的,因为它位于分配的内存之外。

换句话说

scanf("%d", pMatrix[i][j]);
Run Code Online (Sandbox Code Playgroud)

是错的。您需要额外的取消引用来获取各个整数,并需要 a&来获取其地址,以便可以在scanf.

你可以做:

scanf("%d", &pMatrix[0][i][j]);  // [0] because you only allocate 1 2D array
Run Code Online (Sandbox Code Playgroud)

或者

scanf("%d", &(*pMatrix)[i][j]);  // (*pMatrix) works just like pMatrix[0]
                                 // The ( ) is important due to
                                 // operator precedence.
Run Code Online (Sandbox Code Playgroud)

他们是一样的。