位域允許在結構體中按位分配成員,極大節省內存,常用於硬件寄存器映射、網絡協議頭、標誌位組合。本文講解定義語法、內存佈局規則、無名位域填充、指針訪問、跨字節限制。
struct BitField {
int a : 8; // 佔 8 位
int b : 2; // 佔 2 位
int c : 6; // 佔 6 位
};
// 總計 16 位 = 2 字節
int、signed int、unsigned int(建議顯式指定符號性)unsigned : 0 強制對齊到下一單元;int : 3 僅作填充不可訪問
struct {
unsigned a : 4;
unsigned : 0; // 強制 a 佔滿一字節低 4 位,高 4 位填充
unsigned b : 4; // 從下一字節開始
unsigned c : 4;
} x;
// 佈局:[a(4)|pad(4)] [b(4)|c(4)] = 2 字節
struct BS {
unsigned a : 1;
unsigned b : 3;
unsigned c : 4;
} bit, *pbit = &bit;
bit.a = 1;
bit.b = 7;
bit.c = 15;
printf("%d,%d,%d\n", bit.a, bit.b, bit.c); // 1,7,15
pbit->a = 0;
pbit->b &= 3; // 7 & 3 = 3
pbit->c |= 1; // 15 | 1 = 15
printf("%d,%d,%d\n", pbit->a, pbit->b, pbit->c); // 0,3,15
位域支持指針操作(->)、位運算(&=、|=、^=)。
&bit.a 編譯錯誤struct { int a:8; } arr[2]; 中 arr[0].a 和 arr[1].a 可能不連續int a:3 範圍 -4~3,unsigned a:3 範圍 0~7sizeof(struct { int a:1; }) 通常為 4struct { unsigned enable:1; unsigned mode:3; unsigned reserved:4; } reg;unsigned read:1; write:1; exec:1; hidden:1;位域是 C 語言「以空間換時間、以結構換清晰」的利器。掌握不跨存儲單元、無名填充對齊、不可取址、符號性選擇、可移植性風險五大核心點,即可在嵌入式、系統編程中安全高效使用。