c語言之零長度陣列

2021-09-26 13:19:17 字數 747 閱讀 1531

我們設想這樣乙個場景, 我們在網路通訊過程中使用的資料緩衝區, 緩衝區包括乙個len欄位和data欄位, 分別標識資料的長度和傳輸的資料, 我們常見的有幾種設計思路

1、定長資料緩衝區, 設定乙個足夠大小 max_length 的資料緩衝區

2、設定乙個指向實際資料的指標, 每次使用時, 按照資料的長度動態的開闢資料緩衝區的空間.

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

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

首先, 需為結構體分配一塊記憶體空間;

其次再為結構體中的成員變數分配記憶體空間.

這樣兩次分配的記憶體是不連續的, 需要分別對其進行管理. 當使用長度為的陣列時, 則是採用一次分配的原則, 一次性將所需的記憶體全部分配給它.

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

1、分配空間時一次完成的,並且記憶體是連續的

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

乙個簡單的例子

#include struct zero_data ;

int main()

我們可以看到

1、struct zero_data的大小是不包含零長度陣列

2、為改結構體分配了相應的空間,就可以像平常運算元組一樣操作這個零長度陣列

C 零長度陣列

在c語言中,陣列大小是固定的,沒有變長度的,為了達到獲取變數長度的陣列,提供了零長度陣列這樣的方式來實現,如定義乙個結構體 struct test 這樣,結構體本身長度 sizeof int 也就是乙個整型長度,contents是不佔空間的,然後在程式呼叫中,可以採用如下 struct test t...

零長度陣列

零長度陣列 神奇的int reserve 0 include include struct device 構題 device 之後 這種宣告方法可以巧妙的實現c語 言裡的陣列擴充套件 int main a.out p dev reserve 0 100 p dev reserve 24 0 size...

零長度陣列

最近在準備分析linux input子系統,發現核心 裡面有很多小技巧。特此記錄下,如有不足之處,敬請指正。在日常的程式設計中,有時候需要在結構體中存放乙個長度動態的字串,比如說,我們要在結構體中存放乙個名字,但是這個名字的長度是未知的。於是,我們就會採用以下兩種方法來解決這個問題。注 以下的 都是...