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