日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法精解 c语言 源码,算法精解七(C语言版)

發(fā)布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法精解 c语言 源码,算法精解七(C语言版) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

存儲空間分配

擋在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。