UB是否可以访问"填充"字节?

Sta*_*ked 10 c++ alignment language-lawyer

如果我有这样一个对象:

struct {
    uint32_t n;
    uint8_t c;
} blob {};
Run Code Online (Sandbox Code Playgroud)

然后将有3'填充'字节.

UB是否可以访问填充的字节?例如:

uint8_t * data = reinterpret_cast<uint8_t*>(&blob);
std::cout << data[4] << data[5] << data[6] << data[7];
Run Code Online (Sandbox Code Playgroud)

我首先假设这可能是UB,但如果这是真的那么memcpy也将是UB:

memcpy(buf, &blob, sizeof(blob));
Run Code Online (Sandbox Code Playgroud)

我的具体问题是:

  • UB是否可以访问填充字节?
  • 如果不是,那么这是否也意味着定义了值?

Set*_*gie 6

不,当整个对象被初始化为零时,不是UB访问填充(标准在§8.5/ 5中说,当对象初始化时,填充初始化为0位)或者值初始化并且它不是具有用户定义的构造函数的类.

  • @DavidRodríguez-dribeas:在C++中你的例子`int b = a`是UB.4.1/1,"如果对象未初始化,则需要[左值到右值]转换的程序具有未定义的行为." (3认同)