如果我有一個像這樣的對象:訪問「填充」字節是否是UB?
struct {
uint32_t n;
uint8_t c;
} blob {};
然後將有3「填充」字節。
難道UB訪問的填充字節?例如:
uint8_t * data = reinterpret_cast<uint8_t*>(&blob);
std::cout << data[4] << data[5] << data[6] << data[7];
我首先假定這很可能是UB,但如果這是真的,那麼一個的memcpy將UB還有:
memcpy(buf, &blob, sizeof(blob));
我的具體問題是:
- 是它UB訪問填充字節?
- 如果沒有,那麼是否意味着該值定義呢?
由於這是一個非常規則性的問題,我不確定最終答案是什麼。我懷疑它會被定義(只要uint8_t *是unsigned char *),但初始值將保持未指定狀態,就像任何其他未初始化的成員變量。現在,如果你想要規範引用,我把它留給有更多時間的人來查看它:) –
我假設'uint32_t'與'sizeof(uint32_t)'對齊。 – StackedCrooked
@PeterG:標準要求sizeof(blob)至少爲5.既然'uint8_t'存在,那麼'CHAR_BIT == 8'因此'sizeof(uint32_t)== 4'。然後是「sizeof(blob)」是5還是8的一致性問題。允許任意奇怪的實現使其成爲6或7. –