演算法精解七(C語言版)

2021-06-28 17:30:54 字數 1619 閱讀 8993

儲存空間分配

擋在c中宣告乙個指標時,與宣告其他型別的變數類似,一定量的儲存空間會分配給這個指標。通常情況下指標會占用乙個機器字長的儲存空間,但有些時候他們的大小也有所不同。因此 為了保證**的可移植性,不應該假設每個指標都占有乙個特定大小的儲存空間,指標變數的大小通常與編譯器的設定以及某些特定的c實現中的型別界定符有關。必須要記住的一點是:當宣告乙個指標時,僅僅只是為指標本省分配了空間,並沒有為指標所引用的資料分配空間。而為資料分配儲存空間有兩種方法:一種是直接宣告乙個變數;另一種是在執行時動態地分配儲存空間(例如:使用malloc或realloc).

當宣告乙個變數時,編譯器會根據變數的型別預留足夠的記憶體空間。變數的儲存空間是系統自動分配的,但此儲存空間不會在程式的整個生命週期中永久存在,這一點在處理自動變數時尤為重要。自動變數是一種在進入或離開模組或函式時儲存空間能夠自動分配和釋放的變數。例如:在函式f中,iptr的賦值為變數a的位址,當函式f返回時,iptr變成了乙個懸空指標。為什麼會這樣?因為當函式f返回時,變數a已經從函式棧中彈出,變成乙個不合法的變數(見第3章)。

在c語言中,當想要動態分配儲存空間時,我們會得到乙個指向乙個堆儲存空間的指標(見第3章)。此儲存空間由我們自行管理,並不會一直存在,除非我們顯示地將它釋放。例如:在下面這段**中用malloc分配的儲存空間會一直到呼叫函式free來釋放它。所以,當函式g返回時此儲存空間仍然有效(見圖2-2),這一點與之前自動分配儲存空間的變數完全不同。引數iptr是乙個指向我們想要改變其內容的物件的指標(此物件也是乙個指標)所以當g返回時.iptr指向有malloc申請的位址空間.我們會在2.4節進一步**這個問題。

圖 2-2:函式中返回動態分配的儲存空間的指標操作

有些時候,我們甚至會認為指標和動態儲存空間分配是c語言領域中不太好的特性。特別是當產生了由動態記憶體分配所造成的記憶體洩漏問題時。記憶體洩漏問題的產生是由於動態分配了記憶體空間,但從未釋放它(甚至在程式不再使用此資料空間時都不釋放它)造成的。特別是在重複執行**時,這種洩漏完呢提會表現得尤為嚴重。好在我們可以採用統一的記憶體管理方法大大減少此類問題。一種統一的記憶體管理方法例子就是本書中所用到的資料結構例項。每種例項所遵循的理念是,由使用者來管理儲存空間以及與儲存空間相關的實際的資料結構,而資料結構自身只用於維護資料內部變數的儲存空間分配。所以,在資料結構中,只適用指標所指向資料變數,而不是比資料的私有副本。這種應用的乙個重要意義在於,乙個資料結構的實現並不依賴與它所儲存的資料型別和大小。同時,多個資料結構能夠以單個資料形態表現,這個特性在組織大量資料時非常有用。

此外,本書還提供同了如何初始化和銷毀結構的操作。初始化可能會涉及很多步驟,其中之一便是記憶體分配。銷毀資料結構通常包括刪除它所有的資料,並釋放資料結構所用到的記憶體。釋放資料結構的記憶體往往也包含釋放與資料結構本上相關的所有記憶體。這裡有乙個例外,那就是讓使用者自己管理資料的儲存。之所以每個資料結構在舒適化的時候都需要使用由使用者提供的初始化函式,是因為資料儲存的管理實際上是一種與具體應用相關的操作。

演算法精解一(C語言版)

最近無事 抽出點時間來整理一下演算法 希望對自己有進一步的幫助和對學習演算法的同行有一些幫助吧!講到演算法 這個詞是很重乙個解決問題的途徑 無論在什麼行業 演算法都是很重要的。不管你是否承認,無論哪種軟體開發專案,幾乎所有的程式設計師,開發者在日常工作中都要同資料結構和演算法打交道。當我們閱讀原始碼...

演算法精解五(C語言版)

指標操作 在c語言中,對於任何型別t,我們都可以在t所在的記憶體位址處產生乙個包含對此物件位址的對應變數。如果用比較直觀方式來看待這種變數,它們實際上是一種指向物件的變數,如果用比較直觀方式來看待這種變數,它們實際上是一種指向物件的變數 因此,這些變數稱為指標。在c語言中,指標是構建資料結構和操作記...

演算法精解十六(C語言版)

尾遞迴 如果乙個函式所有遞迴形成的呼叫都出現在函式的末尾,我們稱這個遞迴函式是尾遞迴的。當遞迴呼叫是整個函式中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。尾遞迴函式的特點是在回歸過程中不用做任何操作,這個特性很重要,因為大多數現代的編譯器會利用這個特點自動生成優化的 當...