访问超出数组范围不会给出任何错误
Access to out of array range does not give any error
为什么这样:
#include <iostream>
using namespace std;
int main() {
int a[1] = {0};
a[2048] = 1234;
cout << a[2048] << endl;
return 0;
}
不会给出任何编译时错误? (海湾合作委员会 4.9.3)
因为这是合法的 C++。
您可以尝试取消引用任何指针,即使它不是由您的程序分配的,您可以尝试访问数组的任何单元格,即使它超出范围,表达式的合法性不依赖于该表达式中涉及的变量。
编译器不必 运行 任何静态分析来检查你是否真的会导致未定义的行为,并且如果它假设你会(即使很明显你会)不应该编译失败).
问题是你不能在编译时检查所有可能的数组访问(那太昂贵了),所以你必须在某处任意画一条线(问题是 "arbitrarily" 这个词,那个不符合标准)。
因此,检查你不会导致未定义的行为是程序员(或特定静态分析工具)的责任。
Access to out of array range does not give any error
这只是因为你运气不好。 :) 你可以称它为"Undefined Behavior"。编译器没有对数组进行任何绑定检查,而您在语句 a[2048] = 1234;
中试图做的是在堆栈上写入一个未使用的内存位置。
为什么这样:
#include <iostream>
using namespace std;
int main() {
int a[1] = {0};
a[2048] = 1234;
cout << a[2048] << endl;
return 0;
}
不会给出任何编译时错误? (海湾合作委员会 4.9.3)
因为这是合法的 C++。
您可以尝试取消引用任何指针,即使它不是由您的程序分配的,您可以尝试访问数组的任何单元格,即使它超出范围,表达式的合法性不依赖于该表达式中涉及的变量。
编译器不必 运行 任何静态分析来检查你是否真的会导致未定义的行为,并且如果它假设你会(即使很明显你会)不应该编译失败).
问题是你不能在编译时检查所有可能的数组访问(那太昂贵了),所以你必须在某处任意画一条线(问题是 "arbitrarily" 这个词,那个不符合标准)。
因此,检查你不会导致未定义的行为是程序员(或特定静态分析工具)的责任。
Access to out of array range does not give any error
这只是因为你运气不好。 :) 你可以称它为"Undefined Behavior"。编译器没有对数组进行任何绑定检查,而您在语句 a[2048] = 1234;
中试图做的是在堆栈上写入一个未使用的内存位置。