當前位置:
首頁 > 最新 > C語言動態內存分配基礎知識詳解

C語言動態內存分配基礎知識詳解

一:傳統數組(靜態數組)的缺點

1:數組的長度必須事先指定,並且是常整數,不能是變數 int a[5];

2:傳統數組程序員無法由程序員釋放,只能由系統釋放。(並且只能在數組所在函數結束才能釋放)

3:數組的長度在函數運行期間不能動態的擴充和縮小

4:A函數定義的傳統數組,在A函數結束時,在B函數中是不能使用的,因為已經釋放。也就是傳統數組不能跨函數。

區分:靜態存儲與內存的靜態開闢

二:為什麼要動態分配內存

用來解決傳統數組的四個缺陷

三:動態內存分配舉例,以及動態數組的構造

方式:malloc函數,在堆開闢空間

1:malloc是由程序員在堆棧動態開闢空間

2:返回值開闢空間的首地址,但是類型是void *,需要強制類型轉換

3:分配的內存空間應該能整除類型所佔的位元組數

4:包含頭文件malloc.h

5:只能用free(p)來釋放p所指向的動態開闢的內存空間。

6:對動態內存空間的操作,用*p來操作。

7:可以用多個指針指向這個動態空間

8:當有多個指針只向這個動態空間時,只能用free一個指針,多次重複釋放要被報錯

9:可以將動態開闢的的內存指針作為函數參數

問題:p的分配類型是動態的還是靜態的?當調用free(p)後,p的內存空間會被釋放么?

例子:動態構建一個一維數組:

動態擴充數組的長度,也就是在程序運行時動態擴充:realloc(首地址,總共位元組數)

作用:將原來動態開闢的動態內存重新開闢一個位元組數,如果這個數比以前的大,前面的數據保存。如果比原來的小,保留前面的數據。

注意:擴充或者縮放的內存單元是新開闢的內存單元。這個過程中有值的拷貝過程。返回值是新開闢的地址空間首地址。

四:靜態內存和動態內存的比較

靜態開闢的內存:在棧中開闢,由編譯器分配,由系統自動釋放

動態開闢的內存:在堆中開闢,由程序員開闢,由程序員自動釋放。

五:跨函數使用內存的問題


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嵌入式ARM 的精彩文章:

考一考!嵌入式操作系統面試題3道

TAG:嵌入式ARM |