C++中int在非sizeof(int)整数倍地址的访问是否有保障?
非对齐int指针访问的标准合规性问题
你的代码里通过非sizeof(int)整数倍地址的指针访问int的操作,没有C++标准的保障,属于未定义行为。
核心原因:
- C++标准明确要求,
int类型的对象必须对齐到alignof(int)(通常等于sizeof(int))的整数倍内存地址。通过非对齐地址的指针读写int对象,直接违反了这一对齐要求,触发未定义行为。 - 未定义行为意味着标准不对这类操作的结果做任何保证:它可能在你当前的x86/x86_64平台上正常运行(因为这类CPU通常支持非对齐访问,只是可能有性能损失),但换用其他架构(比如部分ARM、MIPS平台)或不同编译器时,可能出现程序崩溃、数据损坏、输出错误结果等不可预测的问题。
针对你的代码说明:
代码中int *ptr = (int*)(array_byte+1);强制转换得到的指针,指向的地址比原数组起始地址偏移1字节,不符合int的对齐要求。后续的*ptr = 127;是对非对齐地址的写入操作,完全属于标准未定义的行为范畴。
内容的提问来源于stack exchange,提问作者Daniel Barna
相关产品推荐
相关产品推荐

