c語言空數組

鏈接  https://www.cnblogs.com/guozhiming2003/archive/2010/03/09/1681951.html

c語言空數組

空數組即下標爲0的數組,如a[0]。在函數中聲明空數組是沒有任何意義的,當然也編譯不過。而在類或結構體中,是可以這樣聲明的。
  struct ast_exten {
  char *exten;
  char stuff[0];
  };
  又如:
  struct ast_include {
  char *name;
  char *rname;
  char stuff[0];
  };
  struct ast_ignorepat {
  const char *registrar;
  struct ast_ignorepat *next;
  char pattern[0];
  };
  這是個廣泛使用的常見技巧,常用來構成緩衝區。比起指針,用空數組有這樣的優勢:
  1.不需要初始化,數組名直接就是所在的偏移
  2.不佔任何空間,指針需要佔用int長度空間,空數組不佔任何空間。
  “這個數組不佔用任何內存”,意味着這樣的結構節省空間;“該數組的內存地址就和他後面的元素的地址相同”,意味着無需初始化,數組名就是後面元素的地址,直接就能當做指針使用。
  這樣的寫法最適合製作動態buffer。因爲可以這樣分配空間:
  malloc(sizeof(struct XXX)+ buff_len);
  看出來好處沒有?直接就把buffer的結構體和緩衝區一塊分配了。用起來也非常方便,因爲現在空數組其實變成了buff_len長度的數組了。
  這樣的好處是:
  一次分配解決問題,省了不少麻煩。大家知道爲了防止內存泄漏,如果是分兩次分配(結構體和緩衝區),那麼要是第二次malloc失敗了,必須回滾釋放第一個分配的結構體。這樣帶來了編碼麻煩。其次,分配了第二個緩衝區以後,如果結構裏面用的是指針,還要爲這個指針賦值。同樣,在free這個buffer的時候,用指針也要兩次free。如果用空數組,所有問題一次解決。
  其次,大家知道小內存的管理是非常困難的,如果用指針,這個buffer的struct部分就是小內存了,在系統內存在多了勢必嚴重影響內存管理的性能。要是用空數組把struct和實際數據緩衝區一次分配大塊問題,就沒有這個問題。
  如此看來,用空數組既簡化編碼,又解決了小內存碎片問題提高了性能。

 

空數組不佔用空間    

#include <stdio.h>
#include <stdint.h>

typedef struct
{
    uint8_t           event;
    uint8_t           data[];
} HC_BT_HDR;

HC_BT_HDR hc_hdr;


void main(void)
{
    printf("sizeof(HC_BT_HDR) = %d\n", sizeof(HC_BT_HDR));
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章