最近看了一些網路程式設計的書,學到了一些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 設定乙個指向實際資料的指標,每次使用時,按照資料的長度動態的開闢...