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



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

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

如果我将用户输入读取到一个临时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;
}
}

scanf和2d数组指针有什么问题?

pMatrix是指向2D数组的指针。

因此,pMatrix[0]将为您带来第一个分配的2D阵列

pMatrix[1]将带您进入第二个分配的2D阵列

pMatrix[2]将带您进入第三个分配的2D阵列

等等

在您的代码中,您只分配一个2D阵列,因此访问pMatrix[1]pMatrix[2]。。。是非法的,因为它在分配的内存之外。

换句话说,

scanf("%d", pMatrix[i][j]);

是错误的。您需要一个额外的解引用来获取单个整数,并需要一个&来获取其地址,以便在scanf中使用它。

你可以做:

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

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

他们是一样的。

相关内容

  • 没有找到相关文章

最新更新