我目前正在学习 C ++ ,截至昨天,我遇到了一个名为数组的新事物。到目前为止我所知道的只是他们可以在某种表格方面保存数据,你可以修改/读取他们持有的数据。
由于我用 C ++ 试验,我以为我会尝试打破它,这让我现在问这个问题。当我尝试从
int lotteryNumbers[5] = {10, 20, 30, 40, 50};
// Yes, I know that the loop count is 5!
for (int loopCount = 0; loopCount <= 5; loopCount++) {
cout << lotteryNumbers[loopCount] << endl;
}
我的输出是;
10
20
30
40
50
13439729 <-- What is this sourcery?!
非常感谢任何帮助,以指导我学习这种复杂的语言。
谢谢, 森
编辑:谢谢你的帮助。现在标记为重复。 :d答案 0 :(得分:6)
C ++让你能够用脚射击自己:在运行时阵列不是边界检查。
请确保您只引用数组中的索引。
读取数组外部索引的行为是 undefined 。 任何都可能发生:包括在内存中打印该位置的内容(在您的情况下可能会发生这种情况 - 请与调试器一起检查)。或者编译器可能会吃掉你的猫。
答案 1 :(得分:4)
在运行时未对数组进行边界检查。你总共有5个条目,从0开始,它最终为4. lotteryNumbers [5]会返回一个垃圾值,因为最后一个索引是4。
应该是:
int lotteryNumbers[5] = {10, 20, 30, 40, 50};
// Yes, I know that the loop count is 5!
for (int loopCount = 0; loopCount <= 4; loopCount++) {
cout << lotteryNumbers[loopCount] << endl;
}
最佳做法是使用数组的大小。
答案 2 :(得分:3)
与Java,C#或Python等其他“现代”语言不同,C ++的理念是“不为你不使用的东西买单”。数组绑定检查需要一些运行时开销,并且不需要其他没有数组绑定错误的“合法”程序。
执行代码lotteryNumbers[5]
时,程序属于 Undefined Behavior 。 C ++ Standard没有指定如果发生未定义的行为会发生什么。在这种情况下,程序会读取一些未初始化的堆栈内存,因此您可以看到“垃圾”值,如13439729
。
如果您想要绑定检查,可以使用std::array<>::at
功能。
#include <array>
std::array<int, 5> lotteryNumbers = { 10, 20, 30, 40, 50 };
std::cout << lotteryNumbers.at(5); // throw std::out_of_range
请注意,我使用的是std::array
,而不是普通数组。它是一个现代风格的数组,在C ++ 11中添加。