作为示例,请考虑以下 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.

推荐答案

写S.A[6]并期望它等于S.B[2]合法吗?

No、因为在C和C++中访问一个绑定undefined behaviour的array.

C11 J.2 Undefined behavior

  • 将指针加减到数组对象和整数类型中,或将指针加减到数组对象和整数类型之外,会生成指向数组对象和整数类型之外的结果

  • 数组下标超出范围,即使对象显然可以通过给定的下标访问(如左值表达式)

C++ standard 100 section 5.7 Additive operators paragraph 5 says:

将整型表达式相加或相减时 在指针中,结果具有指针操作数的类型.如果 指针操作数指向数组对象的元素,数组 足够大,则结果指向从 元素的下标之间的差异 结果数组元素和原始数组元素等于整数表达式. [.]If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

C++相关问答推荐

数据包未从DPDK端口传输到内核端口

如何在Visual Studio代码中关闭此函数名称显示功能?

预先分配虚拟地址空间的区域

在for循环中指向数组开头之前

可变宏不能编译

C将数组传递给函数以修改数组

GCC错误,共享内存未定义引用?

C语言中的数字指针

我在C程序的Flex/Bison中遇到语法错误

从BIOS(8086)中读取刻度需要多少?

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

如何在MSVC中使用intSafe.h函数?

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

C循环条件内的函数

将数组返回到链表

在带中断的循环缓冲区中使用 易失性

我怎样才能用c语言正常运行这两个进程?

将字节/字符序列写入标准输出的最简单形式

如何在 C 中转储变量的位?