为什么:
#include <iostream>
using namespace std;
int main() {
int a[1] = {0};
a[2048] = 1234;
cout << a[2048] << endl;
return 0;
}
没有提供任何编译时错误? (gcc 4.9.3)
答案 0 :(得分:2)
因为这是合法的C ++
您可以尝试取消引用任何指针,即使它没有被您的程序分配,您也可以尝试访问数组的任何单元格,即使它超出范围,表达式的合法性也不依赖于表达式中涉及的变量。
编译器不必运行任何静态分析来检查您是否确实会导致未定义的行为,并且如果假定您愿意,则不应该编译失败(即使您很明显)。 />
问题是你无法在编译时检查所有可能的数组访问(这会太昂贵),所以你必须在某处随意画一条线(问题是“任意”这个词,那就不会' t符合标准)
因此,检查您不会导致未定义的行为是程序员(或特定静态分析工具)的责任。
答案 1 :(得分:1)
访问数组范围不会产生任何错误
这只是因为你不走运。 :)你可以称之为&#34;未定义的行为&#34; 。编译器没有对数组进行任何绑定检查,而您在语句a[2048] = 1234;
中尝试执行的操作是在堆栈上写入一个未使用的内存位置。