柔性陣列及可變長結構體

2021-10-05 20:49:06 字數 1299 閱讀 8761

參考:c語言柔性陣列

可變大小結構體如何定義詳解

《c primer plus》第六版 14.7.9小節

先看下面這個結構體:

struct s_test

;

如上結構體中最後乙個元素允許是未知大小的陣列,這個陣列就是柔性陣列,這樣有柔性陣列成員(flexible array member)的結構體也被稱為可變長結構體或者動態結構體。

在這個定義中要注意:

柔性陣列必須是結構體最後乙個成員;

柔性陣列不能是結構體唯一的成員,必須還要其他成員;

柔性陣列說是大小未知,實際大小是0;

除了在結構體中的柔性陣列,iso c/c++標準規定不能定義長度為0的陣列

例1:

#include

#include

struct line

;int

main()

分配乙個不定長的陣列,於是有乙個結構體,其中有兩個成員,乙個是length,代表陣列的長度,乙個是contents,**陣列的內容。後面**裡的 this_length(長度是10)代表是想分配的資料的長度。

例2:可變長結構體在通訊中可用來構建緩衝區,資料報:

typedef

struct _s_hb_time_report_info

__attribute__

((packed)

) s_hb_time_report_info;

可以用sizeof(s_hb_time_report_info) 求得陣列大小為4,說明柔性陣列是不占用記憶體的。這樣的變長陣列常用於網路通訊中構造不定長資料報,不會浪費空間浪費網路流量,比如我要傳送1024位元組的資料,如果用定長包,假設定長包的長度為2048,就會浪費1024個位元組的空間,也會造成不必要的流量浪費。

對於帶柔性陣列成員的結構使用注意:

不能用結構進行賦值或者拷貝(普通的相同型別的結構可以這樣做),因為這樣只能拷貝除柔性陣列成員以外的成員。要全部拷貝應該用memcpy()函式;

struct flex *pf1,

*pf2;..

.*pf2 =

*pf1;

//錯誤的

不要以傳值的方式把這種結構傳給函式,要傳位址。原因同上;

不要用這種結構做為數組成員或者另外乙個結構的成員;

可變長陣列 柔性陣列結構體成員 可變長結構體

可變長陣列是c99相較c89新增的乙個特性。1.可變長陣列無鏈結性,即只在 塊內作用 函式體內或者區域性 塊內 2.可變長陣列不可初始化。3.陣列長度在生存週期不可更改。即n的值不影響str的長度。4.可變長陣列作為函式形參的時候,中使用 其本質是指標。形參中的陣列還可以使用型別限定詞const v...

基礎 結構體 結構體中的柔性陣列

typedef struct test 造成字串與結構體內存是分離的,有時候不利於操作,例如 複製和訪問的時候,需要做些額外操作。char a hello world test stptest test malloc sizeof test strlen a 1 strcpy char stptes...

vb 可變長 陣列

引用 關鍵點 dim str as string 定義 redim str n 重設長度 or redim preserve str n 重設長度,並保持原來記錄不變 詳細闡述 redim 語句 在過程級別中使用,用於為動態陣列變數重新分配儲存空間。語法 redim preserve varname...