C語(yǔ)言 動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)
一般認(rèn)為c語(yǔ)言程序在內(nèi)存中是分成幾個(gè)存儲(chǔ)區(qū)來(lái)存儲(chǔ)代碼和數(shù)據(jù)的:
(1)代碼區(qū):C語(yǔ)言源代碼經(jīng)過(guò)編譯鏈接后形成可執(zhí)行的機(jī)器代碼,這部分代碼是CPU執(zhí)行的指令部分,只讀,可共享。
(2)只讀數(shù)據(jù)區(qū):存儲(chǔ)程序中不會(huì)被改變的數(shù)據(jù),如各種常量及符號(hào)常量等,這些數(shù)據(jù)不允許被修改。
(3)靜態(tài)存儲(chǔ)區(qū):全局變量和靜態(tài)變量都存儲(chǔ)在此處,其中初始化的全局變量和靜態(tài)變量存放在初始化數(shù)據(jù)區(qū),未初始化的全局變量和靜態(tài)變量存儲(chǔ)在未初始化數(shù)據(jù)區(qū)。未初始化的全局變量和靜態(tài)變量,系統(tǒng)自動(dòng)將數(shù)值型初始化為0,字符型初始化為'\0'。這些變量只有程序結(jié)束才會(huì)被釋放。
(4)動(dòng)態(tài)存儲(chǔ)區(qū):動(dòng)態(tài)存儲(chǔ)區(qū)又分為堆和桟。
?堆:由程序員進(jìn)行分配和釋放。一般使用malloc()、callocO等函數(shù)申請(qǐng)的內(nèi)存空間都是在堆上,這些內(nèi)存空間如果不再使用應(yīng)該由程序員用命令釋放。如free()函數(shù),如果程序員不釋放,程序結(jié)束后可由操作系統(tǒng)回收。
?棧:由編譯器自動(dòng)分配釋放。函數(shù)中所使用的形參及未加static修飾的普通變量都存儲(chǔ)在此處。
這些變量當(dāng)函數(shù)被調(diào)用時(shí)才會(huì)被分配內(nèi)存空間,一旦函數(shù)調(diào)用結(jié)束,所分配空間馬上釋放。
所以靜態(tài)存儲(chǔ)區(qū)的變量在程序執(zhí)行的全過(guò)程中始終占據(jù)著大小固定的存儲(chǔ)單元,直到程序運(yùn)行結(jié)束才予以釋放。
動(dòng)態(tài)存儲(chǔ)的變置是指變量的存儲(chǔ)單元在程序運(yùn)行過(guò)程中由系統(tǒng)動(dòng)態(tài)地分配和回收,當(dāng)定義它們的函數(shù)被調(diào)用時(shí)才會(huì)被分配內(nèi)存空間,函數(shù)調(diào)用結(jié)束,系統(tǒng)收回變量所占內(nèi)存。
根據(jù)變量是靜態(tài)存儲(chǔ)方式還是動(dòng)態(tài)存儲(chǔ)方式,可將變量可分為4種:auto變量、static變量、register變量、extern變量。
點(diǎn)擊加載更多評(píng)論>>