编译器是否允许修改填充字节

Dar*_*bik 5 c padding language-lawyer

假设我有一段像这样的代码(并假设填充是按照我在评论中所说的插入的):

#include "stdint.h"

struct A
{
    uint8_t x;
    // 3 bytes of padding
    uint32_t y;
};


void foo(struct A* a)
{
    a->x = 0;
}
Run Code Online (Sandbox Code Playgroud)

是否允许编译器清除填充字节或对函数 foo 中的填充字节执行任何操作?

https://en.cppreference.com/w/c/language/object在这个问题上保持沉默,这让我相信编译器可以这样做......

我想知道编译器是否允许这样做的原因是我想要memcmp两个结构,并且我想知道我可以假设什么......

Eri*_*hil 9

是的。C 2018 6.2.6.1 6 说:

\n
\n

当值存储在结构体或联合类型的对象中(包括成员对象中)时,与任何填充字节对应的对象表示形式的字节采用未指定的值\xe2\x80\xa6

\n
\n