已知目标地址存有数时数组越界访问是否为未定义行为?附C++代码问询
数组越界访问的未定义行为判定
是,访问x.a[10]属于未定义行为,哪怕你明确知道该地址指向结构体里的b数组区域,也改变不了这个结论,原因如下:
- C++标准明确规定,数组的合法下标范围是从
0到数组长度-1。这里a是长度为8的数组,合法下标仅为0~7,a[10]明显超出了这个范围,本质上已经违反了标准规则。 - 编译器的优化逻辑是基于「程序不会触发未定义行为」的前提设计的。比如它可能会假定对
a的访问绝不会触及b的内存空间,进而对a、b相关的代码做激进优化——这可能导致这个赋值操作被直接忽略,或者破坏其他未知内存区域,甚至引发程序崩溃,最终结果完全不可控。 - 你看到的
a和b内存连续只是当前编译器实现下的巧合,C++标准并没有强制要求结构体中的数组必须紧密排列、无间隙存储。哪怕内存布局固定,越界访问本身已经属于未定义行为范畴。
附上格式化后的原代码:
struct X { double a[8] {0.0}; double b[8] {0.0}; }; int main() { X x; x.a[10] = 1.0; }
内容的提问来源于stack exchange,提问作者Urwald
相关产品推荐
相关产品推荐

