C語言malloc的使用淺談 C語言malloc的使用淺談 參考文獻:C_Free API文檔 在c語言的編程中常常要對內(nèi)存操作,,而這對不少人來說是個不簡單的問題。 最近在做作業(yè)的過程中常??吹皆谟玫酱鎯Y(jié)構(gòu)的地方常常有malloc的身影,,我就在想到底什么時候什么地方該用到malloc 經(jīng)過在百度和狗狗的一番搜搜之后在下的愚見總結(jié)如下: 一,、使用malloc的情況 首先說明一下,由malloc動態(tài)申請的內(nèi)存空間是堆式的內(nèi)存空間,。 而靜態(tài)的內(nèi)存的空間是棧式的,。有關(guān)堆棧的知識請參考其他相關(guān)資料。 1. 大容量內(nèi)存需求 網(wǎng)上說當我們需要的內(nèi)存空間超過0.5兆的時候最好使用動態(tài)內(nèi)存,,也就是利用malloc來申請內(nèi)存空間,。可以這么認為,,如果內(nèi)存過大,,就會不易管理,而malloc可以說事一個專業(yè)的內(nèi)存管理者,,但靜態(tài)的則可以當成是一個業(yè)余的,。畢竟術(shù)業(yè)有專攻。 2. 不確定內(nèi)存需求 當我們需要的內(nèi)存空間大小連我們自己也不知道的時候,。為了不使內(nèi)存空間的浪費,。我們需要用到malloc函數(shù)??梢赃@樣理解如果說靜態(tài)的內(nèi)存空間是一個鐵盒子的話那么動態(tài)內(nèi)存空間就可以看作是可伸縮的袋子,,它的容量可以根據(jù)你所裝物體的體積不同而定制。當然我們也可以利用靜態(tài)內(nèi)存,,這樣會有兩種可能出現(xiàn)的結(jié)果,,一是你所申請的空間不夠用,程序異常,。二是申請的內(nèi)存過大,,浪費。 我們來看在鏈表中情況,,如果我們定義好了一個長度為十的鏈表之后想要在某個位置插入或刪除一個節(jié)點,。這個時候我們數(shù)組靜態(tài)的話肯定會在數(shù)組數(shù)值的移動上花費有很大的開銷。而利用malloc動態(tài)存儲時就不會出現(xiàn)這樣的情況,。由于動態(tài)申請到存儲空間不一定是連續(xù)的存儲空間,。所以當我們使用malloc申請空間時。計算機會在‘任意’可以申請到空間的地方給我們開辟需要的空間來供我們使用,。新申請的空間與原來的空間只有通過指針想連接的關(guān)系物理上并一定有前后的關(guān)系,。所以就不需要對原來的數(shù)據(jù)做移動操作。這樣的系統(tǒng)開銷就相對小了很多,。相應(yīng)的free的時候也是對“不相關(guān)”的空間進行操作,。所以也不用對數(shù)據(jù)做移動操作。 3. 備注 二、如何科學使用malloc 1. 申請 語法:
功能: 函數(shù)返回一個指向num 數(shù)組空間,,每一數(shù)組元素的大小為size,。如果錯誤發(fā)生返回NULL。
malloc
功能: 函數(shù)指向一個大小為size的空間,,如果錯誤發(fā)生返回NULL,。 存儲空間的指針必須為堆,不能是棧,。這樣以便以后用free函數(shù)釋放空間,。例如: typedef struct data_type { int age; char name[20]; } data;
data *bob; bob = (data*) malloc( sizeof(data) ); if( bob != NULL ) { bob->age = 22; strcpy( bob->name, "Robert" ); printf( "%s is %d years old\n", bob->name, bob->age ); } free( bob );
語法:
功能: 函數(shù)將ptr 對象的儲存空間改變?yōu)榻o定的大小size。 參數(shù)size可以是任意大小,,大于或小于原尺寸都可以,。 返回值是指向新空間的指針,如果錯誤發(fā)生返回NULL,。 2. 釋放 語法:
功能: 函數(shù)釋放指針ptr指向的空間,,以供以后使用。指針ptr 必須由先前對malloc(), calloc(), realloc()的調(diào)用返回,。例如: typedef struct data_type { int age; char name[20]; } data;
data *willy; willy = (data*) malloc( sizeof(willy) ); ... free( willy );
|
|
來自: 遺落之心 > 《專業(yè)知識》