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 分配空間,
struct line *my_line = (struct line *) malloc (sizeof (struct line) + my_len);
想用多少,就追加多少。
零長數組和指針的區別
有人說,用指針也可以實現。比如
struct line {short len;void *contents; };其實是有區別的:
所以,零長數組的優勢就體現出來了。
定義什么類型的零長數組
有人認為,結構體尾部的零長數組應該是 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 中的零长数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongotemplate模糊查_jav
- 下一篇: 计算机网络课程实训方法,《计算机网络基本