例如,考虑以下结构:
struct S {
int a[4];
int b[4];
} s;
编写
s.a[6]
并期望它等于s.b[2]
是否合法?就个人而言,我认为它必须是C++中的UB,而我不确定C。
但是,我找不到与C和C++语言标准相关的任何内容。
更新
有几个答案建议如何确保没有填充的方法
字段之间,以使代码可靠地工作。我想强调
如果这样的代码是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
。 最佳答案
没有。因为访问数组超出范围会在C和C++中调用未定义行为。
C11 J.2未定义行为
C++标准draft第5.7节加法运算符第5段说:
关于c++ - 在一个结构中,使用一个数组字段访问另一个字段是否合法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47094166/