为什么OutOfRange数组索引仍会打印一个值?

时间:2014-01-02 00:58:51

标签: c++ arrays

我一直在玩C ++中的数组,我注意到如果我告诉程序从索引中打印一个技术上应该超出范围的值,程序仍然能够找到它的值。这是怎么发生的?

代码:

#include <iostream>

using namespace std;

int main(void)
{
    int x = 0;
    int array[5][5];
    for (int row = 0; row < 5; row++) {
        cout << "OutOfRange array index [0][8]: " << array[0][8] << endl;
        cout << "OutOfRange array index [2][8]: " << array[2][8] << endl;
        cout << "OutOfRange array index [8][8]: " << array[8][8] << endl;
        cout << "OutOfRange array index [88][88]: " << array[88][88] << endl;
        cout << "OutOfRange array index [90][90]: " << array[93][93] << endl;
        for (int col = 0; col < 5; col++) {
            array[row][col] = x;
            x++;
            cout << array[row][col] << " ";
        }
        cout << endl;
    }
    return 0;
}

对于某些索引,它返回一个非常高的值,我假设它是一个内存地址,但是对于其他索引,它似乎能够找到一些值(或者只是巧合,内存地址足够低,让我觉得它一个值?)。

OutOfRange array index [0][8]: 0
OutOfRange array index [2][8]: 17
OutOfRange array index [8][8]: 0
OutOfRange array index [88][88]: 0
OutOfRange array index [90][90]: 152176
0 1 2 3 4 
OutOfRange array index [0][8]: 0
OutOfRange array index [2][8]: 17
OutOfRange array index [8][8]: 2104726264
OutOfRange array index [88][88]: 0
OutOfRange array index [90][90]: 152176
5 6 7 8 9 
OutOfRange array index [0][8]: 8
OutOfRange array index [2][8]: 17
OutOfRange array index [8][8]: 2104726264
OutOfRange array index [88][88]: 0
OutOfRange array index [90][90]: 152176
10 11 12 13 14 
OutOfRange array index [0][8]: 8
OutOfRange array index [2][8]: 17
OutOfRange array index [8][8]: 2104726264
OutOfRange array index [88][88]: 0
OutOfRange array index [90][90]: 152176
15 16 17 18 19 
OutOfRange array index [0][8]: 8
OutOfRange array index [2][8]: 18
OutOfRange array index [8][8]: 2104726264
OutOfRange array index [88][88]: 0
OutOfRange array index [90][90]: 152176
20 21 22 23 24 
Program ended with exit code: 0

[2][8]索引对我来说也很有趣。为什么在17循环的最后一次运行期间它的值从18更改为outer for

3 个答案:

答案 0 :(得分:3)

在C ++中没有数组绑定检查。你正在做的是从堆栈中读取一些垃圾值。这是一个未定义的行为。

答案 1 :(得分:1)

这只是幽灵数据。没有什么有用或可靠的。不要这样做。

答案 2 :(得分:1)

您所看到的是未定义的行为。 C ++不会像Java和C#等其他语言那样对数组进行边界检查。如果你给出一个无效的数组索引,它仍然指向一块内存,而不是你分配给该数组的内存。

既然如此,如果你给出一个超出范围的数组索引,它就不会抛出异常,它只会随机做一些事情(print garbage,segfault等)。在你的情况下,它不会崩溃,而是在该索引上打印内存的内容,格式为int