0元素數組實現變長TLV數據結構

使用0元素數據來實現變長的TLV數據結構,這種實現方法巧妙,使用方便,但注意老版本C不支持這種定義,C99支持。

如下結構體:

struct pkt {

    UINT16 pkt_type;

    UINT16 pkt_len;

    char pkt_data[0];

}

 

結構體中最後一個成員爲0元素的數組,值得注意的是在這個結構體中pkt_data[0]成員並不佔有內存空間,也就是說sizeof(pkt) = 4, 可以理解爲pkt_data[0]是個內存偏移量,是指向前兩個成員之後的內存地址。

這種結構體能巧妙的實現變長的TLV數據結構,並且內存操作方便,如下:

struct pkt *L2_pkt;

UINT16 L2_pkt_len = 2048;

......

......

L2_pkt = (struct pkt * )malloc(sizeof(struct L2_pkt)+sizeof(char)*pkt_len);

L2_pkt->pkt_type = L2_PKT;

L2_pkt->pkt_len = l2_pkt_len;

L2_pkt->pkt_data[0]=....

......

......

free(L2_pkt)

 

可以看到在分配內存時,只需一次分配給結構體長度和data長度,在free時也只需要一次操作。與用指針實現相比較而言,內存操作更爲方便。

這裏的0元數組相當於一個偏移量,不佔用內存空間,和指針還是有區別的,要是改用指針需要佔用四個字節的空間。

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