c語言之零長度數組

我們設想這樣一個場景, 我們在網絡通信過程中使用的數據緩衝區, 緩衝區包括一個len字段和data字段, 分別標識數據的長度和傳輸的數據, 我們常見的有幾種設計思路

1、定長數據緩衝區, 設置一個足夠大小 MAX_LENGTH 的數據緩衝區

2、設置一個指向實際數據的指針, 每次使用時, 按照數據的長度動態的開闢數據緩衝區的空間.

對於第一種,很明顯會出現空間的浪費,比如實際buffer大小爲1024,而我們設置的數組空間爲2048,這就將浪費1024個byte的空間。

對於第二種,需要有兩次分配空間過程,一次是指針的大小,一次是分配的空間的大小,這樣只多消耗了該指針大小的空間,除此之外,分配的空間需要有兩步

  1. 首先, 需爲結構體分配一塊內存空間;

  2. 其次再爲結構體中的成員變量分配內存空間.

這樣兩次分配的內存是不連續的, 需要分別對其進行管理. 當使用長度爲的數組時, 則是採用一次分配的原則, 一次性將所需的內存全部分配給它.

零長度數組實際相當於兩種情況的結合,

1、分配空間時一次完成的,並且內存是連續的

2、空間不多不少,就是我們要使用的空間大小

一個簡單的例子

#include <stdio.h>
struct zero_data {
        unsigned int len;
        char data[0];
};
int main()
{
        int len  = 15;
        struct zero_data *buffer = (struct zero_data *)malloc(sizeof(struct zero_data)
                                   + len * sizeof(char));
        buffer->len = len;
        memcpy(buffer->data, "hello world", 15);
        printf("buffer len :%d\n", sizeof(*buffer));
        printf("buffer data: %s\n", buffer->data);
}

我們可以看到

1、struct zero_data的大小是不包含零長度數組

2、爲改結構體分配了相應的空間,就可以像平常操作數組一樣操作這個零長度數組

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