arrays - 为什么 scanf 不将整数存储在正确的数组位置?
问题描述
我正在创建一个动态分配的二维 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;
}
如果我将用户输入读入临时 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
是指向二维数组的指针。
所以pMatrix[0]
会带你到第一个分配的二维数组,
并将pMatrix[1]
带您进入第二个分配的二维数组,
并将pMatrix[2]
带您进入第三个分配的二维数组,
等等。
在您的代码中,您只分配一个二维数组,因此访问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.
他们是一样的。
推荐阅读
- python - ValueError: 无法为张量 u'target/Y:0' 提供形状 (64,) 的值,其形状为 (?,4) 形状为 '(?, 10)'
- rust - 为什么 Pin::new_unchecked(&self) 有效但 Pin::new_unchecked(&self).as_ref() 无效?
- flutter - BottomNavigationBar 不粘在键盘顶部
- python - 如何在 Python 中删除列表中的引号
- node.js - 用数据库中的调用函数替换 JSON 对象
- python - 如何构建与 ScanNet 类似的数据集(来自点云的 3d 实例分割)
- pytorch - RuntimeError:4 维权重的预期 4 维输入
- android - 如何使用 Sqldelight 中的复合主键从表中删除行列表?
- javascript - 如何修复嵌套 forEach
- html - 删除按钮不起作用烧瓶 sqlalchemy