柔性數組是 C99 引入的特性,允許結構體最後一個成員為不定長度數組。實現變長結構體,內存連續分配,減少碎片。
type name[](空方括號)或 type name[0](GCC 擴展)sizeof(struct) 不包含柔性數組大小malloc(sizeof(struct) + len * sizeof(type))struct str {
int len;
int b;
char s[]; // 柔性數組
};
int main() {
struct str *p = malloc(sizeof(struct str) + 10);
p->len = 100; p->b = 50;
strcpy(p->s, "abc");
printf("s = %s\n", p->s); // 輸出: abc
printf("sizeof = %zu\n", sizeof(struct str)); // 8 (兩個int)
printf("addr s = %p, addr b = %p\n", p->s, &p->b); // s 緊跟 b 之後
free(p);
return 0;
}
+----------+----------+----------+----------+ | len | b | s[0] | s[1]... | +----------+----------+----------+----------+ 4 bytes 4 bytes 1 byte ...
sizeof(struct str) == 8,柔性數組不佔用結構體大小,但緊隨其後分配。
struct str_mid {
int len;
char s[]; // 中間位置
int b;
};
測試發現:s 與 b 地址相同,寫入 s 會覆蓋 b,類似聯合體行為,不推薦使用。
| 方案 | 內存連續性 | 分配次數 | 碎片 | 釋放 |
|---|---|---|---|---|
| 柔性數組 | 是 | 1次 | 少 | 1次free |
| 指針成員 | 否(通常) | 2次 | 多 | 2次free |
struct str_c90 {
int len;
char s[1]; // 或 s[0] (GCC)
};
分配時同樣 malloc(sizeof(struct) + extra),但 sizeof 會包含 1 字節,需手動減去。