C語言 0位元組長度陣列的使用

2021-10-14 10:02:45 字數 2401 閱讀 1936

最近看了一些網路程式設計的書,學到了一些c語言的「奇巧淫技」,遂開此欄目,進行記載。

問題引出:

試求以下兩個結構體的長度,並簡述如何使用這種0位元組長度的陣列

typedef struct zero_byte_buffer1  zero_byte_buffer1_t;

typedef struct zero_byte_buffer2 zero_byte_buffer2_t;

gnu c中提供了這種0長度陣列的支援,只要將0長度陣列放在結構體的末尾就可以在支援gnu c的編譯器中編譯通過上述結構體,並方便的使用它們。

當然學習這種「奇巧淫技」的最好方法就是測試它、對比它,知其然知其所以然,就能化為己用,上**:

/* zero_byte_array

*/#include #include #include "freertos/freertos.h"

#include "freertos/task.h"

#include "sdkconfig.h"

#define max_length 1024

#define current_length 3

typedef struct zero_byte_buffer1 zero_byte_buffer1_t;

typedef struct zero_byte_buffer2 zero_byte_buffer2_t;

typedef struct fixed_length_buffer fixed_length_buffer_t;

typedef struct variable_length_buffer variable_length_buffer_t;

/*2. free*/

free(zero_byte_buffer1);

zero_byte_buffer1 = null;

/*use fixed_length_buffer*/

/*1. malloc*/

if ((fixed_length_buffer = (fixed_length_buffer_t *)malloc(sizeof(fixed_length_buffer_t))) != null)

/*2. free*/

free(fixed_length_buffer);

fixed_length_buffer = null;

/*use fixed_length_buffer*/

/*1. malloc*/

if ((variable_length_buffer = (variable_length_buffer_t *)malloc(sizeof(variable_length_buffer_t))) != null)

}/*2. free*/

free(variable_length_buffer->data);

free(variable_length_buffer);

variable_length_buffer = null;

}

編譯執行結果:

test begin

zero_byte_buffer1 length is 8

zero_byte_buffer2 length is 4

fixed_length_buffer length is 1028

variable_length_buffer length is 8

3, ok

3, ok

3, ok

通過測試結果可以發現:

1.比較zero_byte_buffer1 length is 8 和zero_byte_buffer2 length is 4兩條測試結果可知

0位元組長度的陣列,自己本身並不占用結構體的空間,但是會影響結構體的位元組對齊。

2.什麼時間使用0位元組長度的陣列呢?

比較使用zero_byte_buffer(使用0位元組長度的陣列的buffer型別)、 fixed_length_buffe(使用定長陣列的buffer)、variable_length_buffer(使用變長陣列、或說指標的buffer)的三種方法,可見,通過使用0位元組長度的陣列,zero_byte_buffer實現了可變長的buffer型別。

這種可變長的buffer型別的好處是:

1)相比使用定長陣列的buffer ,即fixed_length_buffe,其data的長度是可變的,可根據當前實際的data的長度進行靈活的申請需要的空間。

2)相比於使用變長陣列的buffer,即variable_length_buffer,其節省了乙個malloc 、free時的操作步驟,即variable_length_buffer需要兩次malloc、兩次free,但zero_byte_buffer只需一次malloc和一次free。

(謝謝點讚或收藏,比心)

0長度陣列的使用,重點掌握的知識

0長度的陣列在iso c和c 的規格說明書中是不允許的,但是gcc的c99支援的這種用法。gcc對0長度陣列的文件參考 arrays of length zero 如下 片段,哪個更簡潔更靈活,看一眼就知道了 include include typedef struct tagarray array...

結構體0長度陣列的作用

在標準 c 和 c 中,不允許用 0 長度陣列,但在 gnu c 中,卻可以定義 0 長度陣列。比如 引用 struct line 0 長度陣列不占有空間,從列印 sizeof struct line 可以看到這個結構體的長度為 4,這 4 位元組空間屬於整型量 length 那麼結構體裡最後的 0...

c語言之零長度陣列

我們設想這樣乙個場景,我們在網路通訊過程中使用的資料緩衝區,緩衝區包括乙個len欄位和data欄位,分別標識資料的長度和傳輸的資料,我們常見的有幾種設計思路 1 定長資料緩衝區,設定乙個足夠大小 max length 的資料緩衝區 2 設定乙個指向實際資料的指標,每次使用時,按照資料的長度動態的開闢...