日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GNU C 中的零长数组

發布時間:2025/3/15 编程问答 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GNU C 中的零长数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 什么是零長數組(Arrays of Length Zero)
    • 零長數組的使用
    • 零長數組和指針的區別
    • 定義什么類型的零長數組

什么是零長數組(Arrays of Length Zero)

如果我們在程序中定義一個零長度數組,你會發現除了 GCC 編譯器,在其它編譯環境下可能就編譯通不過或者有警告信息。

咱們看一個很簡單的例子:

int buffer[0]; int main(void) {printf("%d\n", sizeof(buffer));return 0; }

你會發現,輸出結果是 0

也就是說,長度為 0 的數組是不占用內存空間的。

零長數組的使用

但是,零長度數組一般不單獨使用,它常常作為結構體的最后一個成員,構成一個變長結構體。我們看一個例子

#include <string.h> #include <stdlib.h> #include <stdio.h>struct line {short len;char contents[0]; };int main(void) {const char *txt = "hello";int my_len = strlen(txt) + 1;struct line *my_line = (struct line *) malloc (sizeof (struct line) + my_len);my_line->len = my_len; memcpy(my_line->contents, txt, my_len);printf("%s\n",my_line->contents); printf("sizeof struct line = %lu\n", sizeof (struct line));printf("address struct line = %p\n", my_line);printf("address of char contents[0] = %p\n", &my_line->contents); }

輸出結果是:

hello
sizeof struct line = 2
address struct line = 0x8c8010
address of char contents[0] = 0x8c8012

注意:

  • struct line 的大小是 2 個字節,說明零長數組 contents 確實不占用空間
  • contents 數組的起始地址就在 short len 的后面;原因是數組的類型是 char,如果改成 int ,那么在 short len 的后面就有填充
  • 我們可以通過結構體成員 contents 訪問內存(代碼 17-18 行)。contents 就好比是一個標簽,代表著某個地址常量
  • malloc 只調用了一次(第 15 行)
  • 結合這個例子,零長數組的好處是,可以根據需要給 struct line 分配空間,

    struct line *my_line = (struct line *) malloc (sizeof (struct line) + my_len);

    想用多少,就追加多少。

    零長數組和指針的區別

    有人說,用指針也可以實現。比如

    struct line {short len;void *contents; };

    其實是有區別的:

  • void *contents 是一個變量,本身是占用內存的
  • 在使用的時候,contents 指向另外一塊內存,也就是說還要調用一次 malloc
  • contents 指向的內存和 struct line 占用的內存一般是不連續的
  • 所以,零長數組的優勢就體現出來了。

    定義什么類型的零長數組

    有人認為,結構體尾部的零長數組應該是 char 類型,好處是節省空間,不需要在它前面填充。其實不然,具體是什么類型根據應用來定。

    比如 Linux 內核里面有個結構體——USB request block

    struct urb {struct kref kref;void *hcpriv;atomic_t use_count;atomic_t reject;int unlinked;...int error_count;void *context;usb_complete_t complete;struct usb_iso_packet_descriptor iso_frame_desc[0]; };

    11:它使用的零長數組是 struct usb_iso_packet_descriptor 類型,而不是 char 類型。


    參考資料

    嵌入式C語言自我修養 05:零長度數組 - 知乎

    總結

    以上是生活随笔為你收集整理的GNU C 中的零长数组的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。