首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言柔性數組深度解析:零長度數組的內存佈局與應用

     編輯:關於C

柔性數組

柔性數組是 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,柔性數組不佔用結構體大小,但緊隨其後分配。

非標準用法:放在中間(僅 GCC 支持)

struct str_mid {
    int len;
    char s[];  // 中間位置
    int b;
};

測試發現:s 與 b 地址相同,寫入 s 會覆蓋 b,類似聯合體行為,不推薦使用。

優勢對比

方案內存連續性分配次數碎片釋放
柔性數組是1次少1次free
指針成員否(通常)2次多2次free

應用場景

  • 網絡協議頭部 + 變長數據載荷
  • 文件格式解析:固定頭 + 變長體
  • 數據庫記錄:固定字段 + 可變長字段

C90 兼容寫法

struct str_c90 {
    int len;
    char s[1];  // 或 s[0] (GCC)
};

分配時同樣 malloc(sizeof(struct) + extra),但 sizeof 會包含 1 字節,需手動減去。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved