關於動態記憶體分配和陣列的選用(變長選malloc,定長選陣列)
阿新 • • 發佈:2019-01-26
結論在最後,可直接看最後。
工作中遇到了一個這樣的問題。
需要在 一個結構體後面 繫結一個變數,但不能對原結構體進行修改。
比如說:
Struct ss{
Int a;
Char b;
Float c;
};
在這個結構體內部不變的情況下,需要在其後繫結一個 double d的變數。API的入口引數不變,要求在API內部進行繫結。
我最開始的思路是:
這個問題需要考慮的是,要在原結構體的尾部,增加位元組,以便繫結資訊。所以,很容易就想到mallo和realloc。最後選用malloc。先分配足夠大小的動態記憶體,然後將得到的地址指向原結構體。緊接著偏移sizeof(原結構體)的大小,賦值d
很快就完成了這個函式的更改,測試通過。
報告上司,很快過來檢視程式碼。看看了,問我:“malloc是幹嘛的?”我:“啊?動態記憶體分配啊” 問:“你知道什麼時候採用動態記憶體分配麼?”我:“額,。。。。。。”。老大說:“動態記憶體分配,肯定是變長的時候使用。咱們現在這個改動屬於固定長度,所以,動態記憶體分配不是最好的一種選擇。” “那,,用陣列?”我脫口而出道。 老大看了看我說:“對。並且為了程式碼可讀性,你應該在定義一個結構體,比之前結構體多一個變數定義。然後,直接對其賦值就ok了,這樣,後面維護的人看到你的程式碼也會更清晰明白。”我若有所思的點了點頭,說:“立馬就修改!”
所以,動態記憶體和陣列的選用,很好理解。
1:當變數長度是變長的時候,最好使用動態記憶體分配。
否則,用陣列申請,小了,不夠用。大了,浪費空間。
2:當變數長度是定長的時候,最好使用陣列來申請連續空間的記憶體。
動態記憶體也可以,但會浪費堆疊資源,效率沒有陣列高。