看如下**:
#include
typedef struct softarray;
int main()
執行結果:
[[email protected] mydoc]# ./a.out
the struct's size is 4
我們可以看出,_softarrwww.cppcns.comay結構體的大小是4,顯然,在32位作業系統下乙個int型變數大小剛好為4,也就說結構體中的陣列沒有占用記憶體。為什麼會沒有占用內
存,我們平時用陣列時不時都要明確指明陣列大小的嗎?但這裡卻可以編譯通過呢?這就是我們常說的動態陣列,也就是變長陣列。
先不要亂,讓我們再看一段**
#include
#include
typedef struct softarray;
int main()
執行結果:
[root@vm-0-7-centos mydoc]# ./a.out
softarray size is 4
是不是有點程式設計客棧奇怪,為什麼申請了記憶體後結構體大小還是4呢?原因是動態申請的記憶體只是申請給陣列拓展所用,從上個程式我們可以看出結構體的大小在建立時已經
確定了,array明確來說不算是結構體成員,只是掛羊頭賣狗肉而已。
下面我們來看看關於變長陣列的資料:
1、什麼是變長陣列?
變長陣列既陣列大小待定的陣列, c語言中結構體的最後乙個元素可以是大小未知的陣列,也就是所謂的0長度,所以我們可以用結構體來建立變長陣列。
2、變長陣列有什麼用途 ?
它的主要用途是為了滿足需要變長度的結構體,為了解決使用陣列時記憶體的冗餘和陣列的越界問題。
3、用法 :在乙個結構體的最後 ,申明乙個長度為空的陣列,就可以使得這個結構體是可變長的。對於編譯器來說,此時長度為0的陣列並不占用空間,因為陣列名
本身不佔空間,它只是乙個偏移量, 陣列名這個符號本身代 表了乙個不可修改的位址常量 (注意:陣列名永遠都不會是指標! ),但對於這個陣列的大小,我們
可以進行動態分配,對於編譯器而言,陣列名僅僅是乙個符號,它不會占用任何空間,它在結構體中,只是代表了乙個偏移量,代表乙個不可修改的位址常量!
對於變長陣列的這個特點,很容易構造出變成結構體,如緩衝區,資料報等等
typedef struct softa
這樣的變長陣列常用於網路通訊中構造不定長資料報,不會浪費空間浪費網路流量,比如我要傳送1024位元組的資料,如果用定長包,假設定長包的長度為2048,就
會浪費1024個位元組的空間,也會造成不必要的流量浪費。
舉個簡單例子。
#include
#include
typedef struct softarray;
int main()
fo程式設計客棧r(i = 0;i < p->len;i++)
free(p);
return 0;
}執行結果:
[root@vm-0-7-centos mydoc]# ./a.out
注意,記憶體對齊位元組偏移
解決:資料
#pragma pack(1)
struct node
#pragma pack()
1、2、
3、
C語言變長陣列講解
1 什麼是變長陣列?變長陣列既陣列大小待定的陣列,c語言中結構體的最後乙個元素可以是大小未知的陣列,也就是所謂的0長度,所以我們可以用結構體來建立變長陣列。2 變長陣列有什麼用途 它的主要用途是為了滿足需要變長度的結構體,為了解決使用陣列時記憶體的冗餘和陣列的越界問題。3 用法 在乙個結構體的最後 ...
c99變長陣列 c語言程式設計之可變長陣列
是不是看著標題進來了,認為自己看錯了?因為平常我們c程式設計的時候資料長度都是固定好的,沒有聽說過c還能實現變長陣列?不過你沒看錯,c99中確實是有柔性陣列的概念,也就是可變長陣列,c99中允許結構體中的最後乙個成員是長度未知的陣列,其定義格式如下 typedef struct int a char...
C 變長陣列
變長陣列在c99及c11的標準中支援,嚴格講在c 的所有標準中都不支援變長陣列,只是各家編譯器對語言的擴充套件 includeint foo int n int main 嚴格按照c99標準編譯 clang t.c o t std c99 pedantic,輸出正常 嚴格按照c11標準編譯 clan...