| 結構體 | 定義 | sizeof | 說明 |
|---|---|---|---|
| S1 | typedef struct { } S1; | 0 (C) / 1 (C++) | 空結構體:C 標準允許 0,C++ 為保證地址唯一性強制 1。 |
| S2 | struct { int b; int c; } | 8 | 兩個 int(各 4 字節),無填充,自然對齊。 |
| S3 | struct { int b; int c; char *p; } | 16 (64位) / 12 (32位) | 指標大小隨架構:64位 8 字節,32位 4 字節。結構體對齊到最大成員(指標)。 |
| S4 | struct { int b; int c; char s[0]; } | 8 | 零長度數組(柔性陣列成員前身)不佔用空間,sizeof 僅計算前置固定部分。 |
struct Flex {
int len;
char data[0]; // C99 標準寫法:char data[]; (不寫長度)
};
sizeof(Flex) == sizeof(int)(通常 4),不包含 data。malloc(sizeof(Flex) + n * sizeof(char)),data 指向結構體尾部的額外記憶體。S4 (假設 32 位,int 4 字節,對齊 4)
+--------+--------+--------+
| b | c | s[0] | <-- s[0] 位於偏移 8,不佔空間
+--------+--------+--------+
0 4 8 (sizeof = 8)
Flex 分配 10 字節 data
+--------+----------+----------+----------+---+
| len | data[0] | data[1] | ... | |
+--------+----------+----------+----------+---+
4 8 9 18 (總共 4+10=14,對齊可能擴展)
std::vector 或 std::string 替代;GCC/Clang 擴展支援但非標準。sizeof 僅反映**編譯期固定部分**大小。零長度數組/柔性陣列成員是 C 語言實現變長結構體的經典技巧,**不計入 sizeof**,分配時手動加長。理解對齊規則(以最大成員對齊)與架構差異(指標寬度),才能精準預測結構體大小。