无法解释以下C++代码段的输出
Unable to explain the output for the following C++ snippet
#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;
}
上面的代码片段会产生意外的输出:
1
0
但是,当我将 dp 数组大小更改为 dp[100][100] 时, 我得到的预期输出为:
0
0
我也尝试打印 2D 矩阵大小:
sizeof(dp)/sizeof(int)
我得到正确的值:dp[5][6] 为 30,dp[100][100] 为 10000。 我使用 linux 中的标准 g++ 编译器编译并执行了代码。 有人可以向我解释这种错误输出的原因吗?
数组的尺寸[5][6]
。因此,当您尝试使用i
从1
到9
执行dp[1][i] = 1
时,在某个迭代中,dp[1][6] = 1
就完成了。由于"row"中的元素数量6
,它正在做与dp[2][0] = 1
相同的操作,因为该二维数组的所有元素都是按顺序存储的。
所以基本上当你尝试访问dp[1][i]
时,就像startOffset + 1 * rowSize + i
一样。i
大于行大小。
作为旁注,使用memset
对数组进行零初始化是C++的不良做法。最佳做法是使用聚合初始值设定项语法:
int dp[5][6] = {}; // Zero-initialize.
首先,这不是好的代码风格,但由于我不确定您要实现的目标,因此我不会建议如何改进它,而只是回答您的问题:解释输出。
在第一种情况下
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;
}
dp
的第二个索引范围从0
到5
(因为您声明了int dp[5][6]
并且C++数组都是从零开始的)。但是,然后从1
循环第二个索引(i
for
循环中)循环9
。因此,索引6, 7, 8, 9
超出范围,这通常会使您的程序崩溃。
它不会崩溃,因为您已经声明了一个 2d 数组,该数组在单个连续内存块中分配,因此dp[1][6]
溢出到 2d 数组的下一部分。dp[1][6]
相当于dp[2][0]
。
这就是为什么在第一种情况下,您会发现dp[2][0]
等于1
.
但是,当您将声明更改为dp[100][100]
时,6, 7, ...
是有效的第二个索引,因此它永远不会溢出,并且dp[2][0]
保持其初始化值0
。
首先要提到的是 dp[5][6] 是一个 2D 数组,其中有 5 行,每行有 6 列。您可以将其可视化为网格。但现实是每一行都是按顺序排列的。第一行可以容纳 0 到 5。现在,当您在循环中分配 dp[1][6]=1 时,这意味着 dp[2][0] 被分配为 1,因为 dp[1][5] 是第一行的最后一个元素,第一行的第 6 个元素是第 2 行的第一个元素。你会得到相同的 dp[2][1]、dp[2][2] 和 dp[2][3]。但在 dp[2][4] 时会得到 0。
值得一提的是,在不同的体系结构中可能会有所不同。同样,不同的编译器可以以不同的方式工作。
- 为什么我的代码在输出中增加了93天
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 我无法获取以下代码的输出
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 编译并运行后,输出未出现在 Visual Studio 代码中
- VI工作室代码错误无法打开输出文件主.exe
- 代码编译没有任何输出,入门程序
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- 可能我知道为什么这段代码没有给出任何输出吗?
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- Clang 给了我符号更改的警告,但代码仍然产生正确的输出
- 为什么这两个版本的代码给出不同的输出
- 以下与指针相关的代码的输出是什么?
- C++和 Python 中的代码相同,但输出不同
- 为什么我的代码块上没有显示输出?
- C++ 高级代码未给出正确的输出
- (C++)分解这个简单的输入/输出代码:
- 错误的输出代码
- 奇怪的输出(代码块codebblocks -16.01mingw-setup.exe)