【发布时间】:2018-07-12 09:21:21
【问题描述】:
#include <bits/stdc++.h>
using namespace std;
int main() {
int dp[5][6];
memset(dp,0,sizeof(dp));
dp[1][0]=0;
for(int i=1;i<=9;i++){
dp[1][i]=1;
}
cout<<dp[2][0]<<endl;
cout<<dp[3][0]<<endl;
}
上面的 sn-p 产生了一个意外的输出:
1
0
但是,当我将 dp 数组大小更改为 dp[100][100] 时, 我得到预期的输出:
0
0
我也尝试打印 2D 矩阵大小:
sizeof(dp)/sizeof(int)
我得到了正确的值:dp[5][6] 为 30,dp[100][100] 为 10000。 我使用 Linux 中的标准 g++ 编译器编译并执行了代码。 有人可以向我解释这个错误输出的原因吗?
【问题讨论】:
-
尝试打印 sizeof(dp) ,我感觉它的实际值与你期望的不同。
-
您的
for循环编辑数组边界之外的元素。这是未定义的行为。它很可能开始将[2][0]覆盖为[2][3],因为数组在内存中是连续的,但您永远无法确定。 -
我想你有来自
dp[1][6]=1;的UB。越界访问。 -
sizeof(dp) 给出的预期答案为 120 (4*5*6)。
-
@Yksisarvinen 这是真的。我正在大力这样做。我无法解释它如何更改范围内且未超出范围的元素?编译器是否将索引包装在 2D 矩阵中?
标签: c++ multidimensional-array output memset