C語言柔性陣列和動態陣列

2022-03-14 19:29:02 字數 2902 閱讀 2969

【前言】經常看到c語言裡的兩個陣列,總結一下。

參考:

#includetypedef struct _softarraysoftarray;

我們可以看出,_softarray結構體的大小是4,顯然,在32位作業系統下乙個int型變數大小剛好為4,也就說結構體中的陣列沒有占用記憶體。為什麼會沒有占用記憶體,我們平時用陣列時不時都要明確指明陣列大小的嗎?但這裡卻可以編譯通過呢?這就是我們常說的動態陣列,也就是柔性陣列。

1、什麼是柔性陣列?

柔性陣列既陣列大小待定的陣列。c語言中結構體的最後乙個元素可以是大小未知的陣列,也就是所謂的0長度,所以我們可以用結構體來建立柔性陣列。

2、柔性陣列有什麼用途 ?

它的主要用途是為了滿足需要變長度的結構體,為了解決使用陣列時記憶體的冗餘和陣列的越界問題。

3、用法:

在乙個結構體的最後,申明乙個長度為空的陣列,就可以使得這個結構體是可變長的。對於編譯器來說,此時長度為0的陣列並不占用空間,因為陣列名

本身不佔空間,它只是乙個偏移量,陣列名這個符號本身代 表了乙個不可修改的位址常量(注意:陣列名永遠都不會是指標!),但對於這個陣列的大小,我們

可以進行動態分配,對於編譯器而言,陣列名僅僅是乙個符號,它不會占用任何空間,它在結構體中,只是代表了乙個偏移量,代表乙個不可修改的位址常量!

對於柔性陣列的這個特點,很容易構造出變成結構體,如緩衝區,資料報等等:

typedef struct _softarray

softarray;

這樣的變長陣列常用於網路通訊中構造不定長資料報,不會浪費空間浪費網路流量,比如我要傳送1024位元組的資料,如果用定長包,假設定長包的長度為2048,就會浪費1024個位元組的空間,也會造成不必要的流量浪費。

4、舉例

#include#include

//其中有兩個成員:乙個是len,代表陣列的長度;乙個是array,**陣列的內容

typedef struct _softarraysoftarray;

int main()

for(i=0;ilen;i++)

free(p);

return 0;

}

這**的作用是用柔性陣列動態建立陣列並輸出陣列內容,這裡我就直接解釋解釋這兩句**:

softarray* p = (softarray*)malloc(sizeof(softarray) + sizeof(int) *10);

p->len = 10;

第一句,主要是根據你要定義的陣列長度和資料型別以及柔性陣列本身的大小來開闢一塊記憶體空間給柔性陣列p,第二個是定義len的長度,便於確定迴圈列印輸出是迴圈的次數。

5、柔性陣列在「不確定陣列大小」中的應用 

對不確定len值大小的陣列,使用了陣列的方法。若不定義柔性陣列,定義普通陣列len需要確定的值!如10,11...
#include#include

typedef struct _softarraysoftarray;

//列印輸出斐波那契數列

void printfln(softarray *p,int len)

}//動態生成斐波那契數列

void create(int len)

else if( i >= 2 )

else

}printfln(p,len);

free(p);

}//主函式

int main()

動態陣列,即根據實時變化,可以擴大陣列大小。而這個功能的實現需要用到指標和malloc和realloc函式。

int *a = (int*)malloc(10*sizeof(int));那麼 a就相當於乙個有10個元素的陣列。當資料量超過10個放不下的時候,利用

a = (int*)realloc(a, 20*sizeof(int));//意思是把a的大小增加到20,而保持原來已有的資料不變。

上面的函式要包含:#include#include或#include

舉例說明:

#include#includevoid dimensionalvector()

int main()

體現了陣列與指標的關係,可具體參考陣列與指標的轉換關係。

柔性陣列是利用結構體,動態陣列使用了指標與陣列的關係;

前者在建立之後,利用p->array來訪問每乙個值,後者直接利用p來訪問每乙個值;

1、對於用malloc分配的記憶體區間,如果原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分記憶體空間曾經被分配、釋放和重新分配,則其中可能遺留各種各樣的資料。也就是說, 在使用它之前必須先進行初始化(可用memset函式 對其初始化為0);

2、但呼叫calloc()函式分配到的空間在分配時就已經被初始化為0了;

3、rellocc函式用於修改乙個原先已經分配的記憶體塊的大小,可以使一塊記憶體的擴大或縮小。當起始空間的位址為空,即*ptr = null,則同malloc。當*ptr非空:若nuw_size < size,即縮小*ptr所指向的記憶體空間,該記憶體塊尾部的部分記憶體被拿掉,剩餘部分記憶體的原先內容依然保留;若nuw_size > size,即擴大*ptr所指向的記憶體空間,如果原先的記憶體尾部有足夠的擴大空間,則直接在原先的記憶體塊尾部新增記憶體,如果原先的記憶體尾部空間不足,或原先的記憶體塊無法改變大小,realloc將重新分配另一塊nuw_size大小的記憶體,並把原先那塊記憶體的內容複製到新的記憶體塊上。因此,使用realloc後就應該改用realloc返回的新指標。

malloc空間分配演算法:可參考另一篇我的博文:

C語言 柔性陣列

柔性陣列 flexible array 也叫伸縮性陣列,其實就是變長陣列,反映了c語言對精煉 的極致追求。這種 結構產生於對動態結構體的需求。比如我們需要在結構體中存放乙個動態長度的字串,這時候,柔性陣列可以大顯身手了。c99使用不完整型別來實現柔性陣列,標準形式如下 struct mystruct...

C語言柔性陣列

1 柔性陣列 c語言中結構體的最後乙個元素可以是大小未知的陣列 c語言中可以由結構體產生柔性陣列 typedef struct soft array softarray 可以試試,printf d sizeof softarray 列印出它的sizeof 大小 結果是4,也就是說array這個未知長...

C語言動態記憶體管理,柔性陣列

c語言提供了乙個動態記憶體開闢的函式 void malloc size t size 這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。1.如果開闢成功,則返回乙個指向開闢好空間的指標。2.如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。3.返回值的型別是...