我們設想這樣一個場景, 我們在網絡通信過程中使用的數據緩衝區, 緩衝區包括一個len字段和data字段, 分別標識數據的長度和傳輸的數據, 我們常見的有幾種設計思路
1、定長數據緩衝區, 設置一個足夠大小 MAX_LENGTH 的數據緩衝區
2、設置一個指向實際數據的指針, 每次使用時, 按照數據的長度動態的開闢數據緩衝區的空間.
對於第一種,很明顯會出現空間的浪費,比如實際buffer大小爲1024,而我們設置的數組空間爲2048,這就將浪費1024個byte的空間。
對於第二種,需要有兩次分配空間過程,一次是指針的大小,一次是分配的空間的大小,這樣只多消耗了該指針大小的空間,除此之外,分配的空間需要有兩步
-
首先, 需爲結構體分配一塊內存空間;
-
其次再爲結構體中的成員變量分配內存空間.
這樣兩次分配的內存是不連續的, 需要分別對其進行管理. 當使用長度爲的數組時, 則是採用一次分配的原則, 一次性將所需的內存全部分配給它.
零長度數組實際相當於兩種情況的結合,
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、爲改結構體分配了相應的空間,就可以像平常操作數組一樣操作這個零長度數組