程序在內(nèi)存中是分段存儲的。
代碼段:存放語句轉(zhuǎn)換的數(shù)字;程序運行時不可修改;全局段:用來記錄全局變量和靜態(tài)變量的存儲位置;不會隨著程序的運行而改變;棧:存放局部變量,塊變量,形式參數(shù)和返回值的存儲位置;隨著程序的運行其大小將不斷改變;函數(shù)調(diào)用時,開辟空間,函數(shù)調(diào)用結(jié)束收回其空間;不同調(diào)用函數(shù)之間遵循后進先出的原則。堆:存放動態(tài)分布的存儲位置;
一:傳統(tǒng)數(shù)組(靜態(tài)數(shù)組)的缺點
1:數(shù)組的長度必須事先指定,并且是常整數(shù),不能是變量 int a[5];2:傳統(tǒng)數(shù)組程序員無法由程序員釋放,只能由系統(tǒng)釋放。(并且只能在數(shù)組所在函數(shù)結(jié)束才能釋放)3:數(shù)組的長度在函數(shù)運行期間不能動態(tài)的擴充和縮小4:A函數(shù)定義的傳統(tǒng)數(shù)組,在A函數(shù)結(jié)束時,在B函數(shù)中是不能使用的,因為已經(jīng)釋放。也就是傳統(tǒng)數(shù)組不能跨函數(shù)。
區(qū)分:靜態(tài)存儲與內(nèi)存的靜態(tài)開辟
二:為什么要動態(tài)分配內(nèi)存
用來解決傳統(tǒng)數(shù)組的四個缺陷
三:動態(tài)內(nèi)存分配舉例,以及動態(tài)數(shù)組的構(gòu)造
方式:malloc函數(shù),在堆開辟空間
1:malloc是由程序員在堆棧動態(tài)開辟空間2:返回值開辟空間的首地址,但是類型是void *,需要強制類型轉(zhuǎn)換3:分配的內(nèi)存空間應(yīng)該能整除類型所占的字節(jié)數(shù)4:包含頭文件malloc.h5:只能用free(p)來釋放p所指向的動態(tài)開辟的內(nèi)存空間。6:對動態(tài)內(nèi)存空間的操作,用*p來操作。7:可以用多個指針指向這個動態(tài)空間8:當(dāng)有多個指針只向這個動態(tài)空間時,只能用free一個指針,多次重復(fù)釋放要被報錯9:可以將動態(tài)開辟的的內(nèi)存指針作為函數(shù)參數(shù)
問題:p的分配類型是動態(tài)的還是靜態(tài)的?當(dāng)調(diào)用free(p)后,p的內(nèi)存空間會被釋放么?例子:動態(tài)構(gòu)建一個一維數(shù)組:
動態(tài)擴充數(shù)組的長度,也就是在程序運行時動態(tài)擴充:realloc(首地址,總共字節(jié)數(shù))作用:將原來動態(tài)開辟的動態(tài)內(nèi)存重新開辟一個字節(jié)數(shù),如果這個數(shù)比以前的大,前面的數(shù)據(jù)保存。如果比原來的小,保留前面的數(shù)據(jù)。
注意:擴充或者縮放的內(nèi)存單元是新開辟的內(nèi)存單元。這個過程中有值的拷貝過程。返回值是新開辟的地址空間首地址。
四:靜態(tài)內(nèi)存和動態(tài)內(nèi)存的比較
靜態(tài)開辟的內(nèi)存:在棧中開辟,由編譯器分配,由系統(tǒng)自動釋放動態(tài)開辟的內(nèi)存:在堆中開辟,由程序員開辟,由程序員自動釋放。
五:跨函數(shù)使用內(nèi)存的問題
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3055瀏覽量
74331 -
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81413 -
代碼
+關(guān)注
關(guān)注
30文章
4827瀏覽量
69054
原文標(biāo)題:談?wù)剝?nèi)存分配與動態(tài)內(nèi)存分配
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
動態(tài)內(nèi)存管理模塊的設(shè)計原理與實現(xiàn)
![<b class='flag-5'>動態(tài)內(nèi)存</b>管理模塊的設(shè)計原理與實現(xiàn)](https://file.elecfans.com/web1/M00/C0/0A/pIYBAF76jpGAVkrdAABQjiJQsQk334.png)
C語言知識總結(jié):動態(tài)內(nèi)存分配
使用C語言實現(xiàn)簡單動態(tài)內(nèi)存分配
![使用C語言實現(xiàn)簡單<b class='flag-5'>動態(tài)內(nèi)存</b><b class='flag-5'>分配</b>](https://file1.elecfans.com/web2/M00/8E/3C/wKgaomTDe6WAEm-WAAHZkMO2_1Q605.png)
評論