參考: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...