[C語言]宣告陣列的大小是0 ???

在C語言裡面,可不可以宣告一個大小是0的陣列?

例如:

char array[0];

在gcc的話是可以的,並且,如果你sizeof(array),得到的答案,會是0

幹嘛用的?

最常用的作用是,如果你想利用結構表達一組資料的header,而這個header後面的資料是預先不知道長度的陣列,那麼你可以在結構裡面定義一個陣列大小是0的成員,以後你就可以利用這個陣列成員變數去直接存取header之後的資料.

例如:

struct data
{
    char magic_num;
    int len;
    char databody[0];
};

好了,假設你從任何一個地方收到一筆資料封包,這個封包會因為狀況不同而有不同的大小,但是資料的最前面兩個位元組都是固定一個magic number跟一個len代表資料本體的長度的話,你可以把這個封包轉型成struct data的型別,然後直接利用databody這個陣列變數來存取資料,不需要那麼辛苦操作指標來存取

例如
char *recive_buffer;
struct data *data_r;

recive_buffer = recive_from_other();
data_r = (struct data *)recive_buffer;

printf("data total %d\n",data_r->len);
printf("last data is %c\n",data_r->databody[len-1]);

如果你想要創造一個類似的資料封包,大小是30bytes,但是最前面兩個位元組依樣是魔術數字跟長度的話,你也可以利用這個方式來配置這個資料封包的記憶體
例如
char *send_buffer;
send_buffer =(struct data *) malloc(sizeof(struct data) + (30 - 2));
send_buffer.len = (30 -2);
send_buffer.databody[0] = 0;
send_buffer.databody[1] = 1;

...
...
... 
send_buffer.databody[9] = 9;

看到這裡,是不是覺得比先轉成指標然後自己辛苦的自己處理指標移動(然後常常不小心寫錯)還要來的直覺跟方便呢?linux kernel 裡面大量用到這個技巧喔

參考連結

Arrays of Length Zero 
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

留言

這個網誌中的熱門文章

利用net-snmp 的mib2c,由一個MIB檔產出一個可執行的AgentX 程式

ubuntu 16.04開機遇到 flip_done timed out 的問題