当我查看数组值时,它会打印一个随机数。为什么是这样?

时间:2016-08-18 09:54:02

标签: c++

我目前正在学习 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

3 个答案:

答案 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中添加。