作为示例,请考虑以下 struct :
struct S {
int a[4];
int b[4];
} s;
写s.a[6]
并期望它等于s.b[2]
合法吗?
就我个人而言,我觉得C++一定是UB,而C就不太确定了.
然而,我在C和C++语言的标准中找不到任何相关的东西.
Update
有几个答案建议如何确保没有填充物
以使代码可靠地工作.我想强调的是
如果这样的代码是UB,那么没有填充码是不够的.如果是UB,
则编译器可以自由地假设对S.a[i]
和S.b[j]
的访问不
重叠,并且编译器可以自由地对这样的存储器访问重新排序.例如,
int x = s.b[2];
s.a[6] = 2;
return x;
可以转化为
s.a[6] = 2;
int x = s.b[2];
return x;
它总是返回2
.