1. 程式人生 > >關於動態記憶體分配和陣列的選用(變長選malloc,定長選陣列)

關於動態記憶體分配和陣列的選用(變長選malloc,定長選陣列)

結論在最後,可直接看最後。

工作中遇到了一個這樣的問題。

需要在 一個結構體後面 繫結一個變數,但不能對原結構體進行修改。

比如說:

Struct ss{

Int a;

Char b;

Float c;

};

在這個結構體內部不變的情況下,需要在其後繫結一個 double  d的變數。API的入口引數不變,要求在API內部進行繫結。

我最開始的思路是:

這個問題需要考慮的是,要在原結構體的尾部,增加位元組,以便繫結資訊。所以,很容易就想到mallorealloc。最後選用malloc。先分配足夠大小的動態記憶體,然後將得到的地址指向原結構體。緊接著偏移sizeof(原結構體)的大小,賦值d

。這樣就拼接成了一個新的結構體。

很快就完成了這個函式的更改,測試通過。

報告上司,很快過來檢視程式碼。看看了,問我:“malloc是幹嘛的?”我:“啊?動態記憶體分配啊” 問:“你知道什麼時候採用動態記憶體分配麼?”我:“額,。。。。。。”。老大說:“動態記憶體分配,肯定是變長的時候使用。咱們現在這個改動屬於固定長度,所以,動態記憶體分配不是最好的一種選擇。” “那,,用陣列?”我脫口而出道。 老大看了看我說:“對。並且為了程式碼可讀性,你應該在定義一個結構體,比之前結構體多一個變數定義。然後,直接對其賦值就ok了,這樣,後面維護的人看到你的程式碼也會更清晰明白。”我若有所思的點了點頭,說:“立馬就修改!”

所以,動態記憶體和陣列的選用,很好理解。

1:當變數長度是變長的時候,最好使用動態記憶體分配。

否則,用陣列申請,小了,不夠用。大了,浪費空間。

2:當變數長度是定長的時候,最好使用陣列來申請連續空間的記憶體。

    動態記憶體也可以,但會浪費堆疊資源,效率沒有陣列高。