为什么我可以在C++中访问大于数组大小的数组索引?

Thi*_*nId 0 c++ arrays

我正在编写代码并意识到我可以"访问"与数组大小相同或更大索引的数组元素.为什么这不会产生错误?

例如,

#include <iostream>
using namespace std;

int main ()
{
    int b_array[5] = {1, 2, 3, 4, 5};


    cout << b_array[5]  << endl  // Returns 0
         << b_array[66] << endl; // Returns some apparently random value.

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Emi*_*lia 6

唯一的技术答案是"因为C++语言规范说的".访问越界值是未定义的行为.你的个人品味无关紧要.

在"未定义的行为"背后(C++规范中有很多),需要让编译器开发人员根据他们必须运行的平台实现不同的优化.

如果您认为索引经常在循环中使用,如果检查边界,最终会检查每次迭代,总是成功(因此浪费处理器时间).


Unh*_*eep 5

由于会产生性能损失,C++ 不实现边界检查。
例如vector,模板包含一个at()检查边界的函数,但比[]运算符慢约 5 倍。
低级语言往往迫使程序员编写安全且无错误的代码,以换取高性能。