You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知目标地址存有数时数组越界访问是否为未定义行为?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:30:40