#include <iostream>
#include <cstdint>
union S
{
std::int32_t n; // 佔用 4 字節
std::uint16_t s[2]; // 佔用 4 字節
std::uint8_t c; // 佔用 1 字節
}; // 整個聯合體佔用 4 字節
int main()
{
S s = { 1 }; // 初始化首個成員, s.n 現在是活躍成員
// 於此點,從 s.s 或 s.c 讀取是未定義行爲
std::cout << std::hex << "s.n = " << s.n << '\n';
std::cout << std::hex << "s.s = " << s.s << '\n';
std::cout << std::hex << "s.c = " << s.c << '\n';
s.s[0] = 0x0011; // s.s 現在是活躍成員
// 在此點,從 n 或 c 讀取是 UB 但大多數編譯器都對其定義
std::cout << "s.c is now " << +s.c << '\n' // 11 或 00 ,依賴平臺
<< "s.n is now " << s.n << '\n'; // 12340011 或 00115678
getchar();
return 0;
}
共同操作一塊內存,每個成員可以輪流活躍,比如,union表示工作類型時,用char【32】表示教師,用int表示學生,需要不同結果表示同一類型時,可以使用union。