算法精解 c语言 源码,算法精解七(C语言版)
存儲空間分配
擋在C中聲明一個指針時,與聲明其他類型的變量類似,一定量的存儲空間會分配給這個指針。通常情況下指針會占用一個機器字長的存儲空間,但有些時候他們的大小也有所不同。因此 為了保證代碼的可移植性,不應(yīng)該假設(shè)每個指針都占有一個特定大小的存儲空間,指針變量的大小通常與編譯器的設(shè)定以及某些特定的C實現(xiàn)中的類型界定符有關(guān)。必須要記住的一點是:當(dāng)聲明一個指針時,僅僅只是為指針本省分配了空間,并沒有為指針?biāo)玫臄?shù)據(jù)分配空間。而為數(shù)據(jù)分配存儲空間有兩種方法:一種是直接聲明一個變量;另一種是在運行時動態(tài)地分配存儲空間(例如:使用malloc或realloc).
當(dāng)聲明一個變量時,編譯器會根據(jù)變量的類型預(yù)留足夠的內(nèi)存空間。變量的存儲空間是系統(tǒng)自動分配的,但此存儲空間不會在程序的整個生命周期中永久存在,這一點在處理自動變量時尤為重要。自動變量是一種在進(jìn)入或離開模塊或函數(shù)時存儲空間能夠自動分配和釋放的變量。例如:在函數(shù)f中,iptr的賦值為變量a的地址,當(dāng)函數(shù)f返回時,iptr變成了一個懸空指針。為什么會這樣?因為當(dāng)函數(shù)f返回時,變量a已經(jīng)從函數(shù)棧中彈出,變成一個不合法的變量(見第3章)。
在C語言中,當(dāng)想要動態(tài)分配存儲空間時,我們會得到一個指向一個堆存儲空間的指針(見第3章)。此存儲空間由我們自行管理,并不會一直存在,除非我們顯示地將它釋放。例如:在下面這段代碼中用malloc分配的存儲空間會一直到調(diào)用函數(shù)free來釋放它。所以,當(dāng)函數(shù)g返回時此存儲空間仍然有效(見圖2-2),這一點與之前自動分配存儲空間的變量完全不同。參數(shù)iptr是一個指向我們想要改變其內(nèi)容的對象的指針(此對象也是一個指針)所以當(dāng)g返回時.iptr指向有malloc申請的地址空間.我們會在2.4節(jié)進(jìn)一步探討這個問題。
圖 2-2:函數(shù)中返回動態(tài)分配的存儲空間的指針操作
有些時候,我們甚至?xí)J(rèn)為指針和動態(tài)存儲空間分配是C語言領(lǐng)域中不太好的特性。特別是當(dāng)產(chǎn)生了由動態(tài)內(nèi)存分配所造成的內(nèi)存泄漏問題時。內(nèi)存泄漏問題的產(chǎn)生是由于動態(tài)分配了內(nèi)存空間,但從未釋放它(甚至在程序不再使用此數(shù)據(jù)空間時都不釋放它)造成的。特別是在重復(fù)執(zhí)行代碼時,這種泄漏完呢提會表現(xiàn)得尤為嚴(yán)重。好在我們可以采用統(tǒng)一的內(nèi)存管理方法大大減少此類問題。一種統(tǒng)一的內(nèi)存管理方法例子就是本書中所用到的數(shù)據(jù)結(jié)構(gòu)實例。每種實例所遵循的理念是,由用戶來管理存儲空間以及與存儲空間相關(guān)的實際的數(shù)據(jù)結(jié)構(gòu),而數(shù)據(jù)結(jié)構(gòu)自身只用于維護(hù)數(shù)據(jù)內(nèi)部變量的存儲空間分配。所以,在數(shù)據(jù)結(jié)構(gòu)中,只適用指針?biāo)赶驍?shù)據(jù)變量,而不是比數(shù)據(jù)的私有副本。這種應(yīng)用的一個重要意義在于,一個數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)并不依賴與它所存儲的數(shù)據(jù)類型和大小。同時,多個數(shù)據(jù)結(jié)構(gòu)能夠以單個數(shù)據(jù)形態(tài)表現(xiàn),這個特性在組織大量數(shù)據(jù)時非常有用。
此外,本書還提供同了如何初始化和銷毀結(jié)構(gòu)的操作。初始化可能會涉及很多步驟,其中之一便是內(nèi)存分配。銷毀數(shù)據(jù)結(jié)構(gòu)通常包括刪除它所有的數(shù)據(jù),并釋放數(shù)據(jù)結(jié)構(gòu)所用到的內(nèi)存。釋放數(shù)據(jù)結(jié)構(gòu)的內(nèi)存往往也包含釋放與數(shù)據(jù)結(jié)構(gòu)本上相關(guān)的所有內(nèi)存。這里有一個例外,那就是讓用戶自己管理數(shù)據(jù)的存儲。之所以每個數(shù)據(jù)結(jié)構(gòu)在舒適化的時候都需要使用由用戶提供的初始化函數(shù),是因為數(shù)據(jù)存儲的管理實際上是一種與具體應(yīng)用相關(guān)的操作。
總結(jié)
以上是生活随笔為你收集整理的算法精解 c语言 源码,算法精解七(C语言版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络媒体的赢利模式
- 下一篇: NET中使用Memcached的相关资源