C語言變長陣列使用詳解

2022-09-25 03:30:08 字數 1634 閱讀 7828

看如下**:

#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...