記憶體分配方式與變數的生存週期

2021-05-24 01:42:00 字數 953 閱讀 8868

char *aa() 

char *bb()

char *cc()

int main()

程式解析:

1.aa()中,雖然p是區域性變數,儲存在棧中,但它指向的是堆記憶體,函式跳出後堆記憶體不會自動被釋放,所以main()函式中可以接收的到。

2.bb()中,p是乙個陣列,乙個區域性變數,屬於自動分配。函式在跳出後,返回的是p的內容(陣列的位址),但陣列本身已經被釋放了,所以在主函式中接收不到p陣列的內容。

3.cc()中,雖然p是區域性變數,儲存在棧中,但它指向的「hello」是常量,屬於靜態分配,儲存在靜態儲存區,函式跳出時常量也不會被釋放,釋放的只是p變數,它存的只是「hello」的位址,但它已經返回給main()函式接收了,它釋放了沒關係,所以main()函式同樣可以接收「hello」。

記憶體分配方式有三種:靜態分配、動態分配、自動分配。

1.靜態分配:編譯時完成的;儲存在靜態儲存區,程式結束時才被釋放,例如全域性變數,static變數,**,常量等(**、常量可以單獨歸類)。

2.動態分配:程式在執行的時候用malloc或new申請的任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體;儲存在堆裡(不是資料結構的堆)。

3.自動分配:函式執行時由系統自動建立,函式結束時自動被釋放;儲存在棧裡,例如函式的區域性變數。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

堆的解釋:系統把連續空閒的堆記憶體看成乙個個的塊,再用指標鍊錶把所有的塊串起來,需要分配時遍歷鍊錶,找出乙個足夠大小的塊進行分配,剩下的把它放到鍊錶中;用完釋放時,系統再把它放回煉表中。

ps:有趣的比喻:可以把堆記憶體看成乙個沙堆(我忘了在哪本書上看到的了),需要時,用鏟子在沙堆裡鏟出一些沙,用完時,在把它放回到沙堆裡,所以,兩次取沙子不太可能會取到同樣的。 ……

待續……  ^_^

……

C記憶體分配方式與C 記憶體分配方式

c記憶體分配方式 注 malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二 一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組 接下來,將分配...

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...