即使正在访问的成员充分对齐,访问未对齐联合的成员是否是未定义的行为?

use*_*248 2 c memory-alignment undefined-behavior unions language-lawyer

在 C 中,如果我尝试通过未对齐的指针访问类型,则可能会发生不好的事情:

int x[2]; // Assuming CHAR_BIT == 8 && sizeof(int) == 4
*(int *)((char *)x+1) = 10; /* Undefined behavior due to unaligned pointer dereference
    even though there are no out of bounds accesses */
Run Code Online (Sandbox Code Playgroud)

但是,如果相关类型是 a但我只访问不具有对齐要求union的成员,该怎么办?union

union X {
    int i;
    char c[4];
} x[2];
((union X *)((char *)x+1))->i = 10; /* I am guessing this is still undefined behavior
    because accessing an unaligned int through a union does not make a difference as far as I know */
Run Code Online (Sandbox Code Playgroud)

但是下面的代码会调用未定义的行为吗?

((union X *)((char *)x+1))->c[0] = 10;
Run Code Online (Sandbox Code Playgroud)

我很怀疑,因为一方面我union通过运算符取消引用指针,并且由于该字段->而具有对齐要求,但另一方面,我没有触及该字段。那么这会导致任何未对齐的指针访问冲突吗?unionintint

Bar*_*mar 5

强制转换会导致未定义的行为。来自C23 6.3.2.3(7)

指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未针对引用类型正确对齐,则行为未定义。

由于(union X *)((char *)x+1))未正确对齐联合,因此适用第二句话。您是否真正取消引用它并不重要。