例如,考虑以下结构:

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/

10-11 23:01
查看更多