欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

malloc函數(shù)的使用方法

這篇文章給大家分享的是有關(guān)malloc函數(shù)的使用方法的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了做網(wǎng)站、成都網(wǎng)站建設(shè)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。

malloc的全稱是memory allocation,中文叫動(dòng)態(tài)內(nèi)存分配,用于申請(qǐng)一塊連續(xù)的指定大小的內(nèi)存塊區(qū)域以void*類型返回分配的內(nèi)存區(qū)域地址,當(dāng)無(wú)法知道內(nèi)存具體位置的時(shí)候,想要綁定真正的內(nèi)存空間,就需要用到動(dòng)態(tài)的分配內(nèi)存。

void* 類型表示未確定類型的指針。C,C++規(guī)定,void* 類型可以通過(guò)類型轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換為任何其它類型的指針。

一般需和free函數(shù)配對(duì)使用。

函數(shù)定義

原型

extern void *malloc(unsigned int num_bytes);

頭文件

#include <stdlib.h>

函數(shù)聲明

void *malloc(size_t size);

備注:void* 表示未確定類型的指針,void *可以指向任何類型的數(shù)據(jù),更明確的說(shuō)是指申請(qǐng)內(nèi)存空間時(shí)還不知道用戶是用這段空間來(lái)存儲(chǔ)什么類型的數(shù)據(jù)(比如是char還是int或者其他數(shù)據(jù)類型)。

返回值

如果分配成功則返回指向被分配內(nèi)存的指針(此存儲(chǔ)區(qū)中的初始值不確定),否則返回空指針NULL。當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。函數(shù)返回的指針一定要適當(dāng)對(duì)齊,使其可以用于任何數(shù)據(jù)對(duì)象。

說(shuō)明

關(guān)于該函數(shù)的原型,在以前malloc返回的是char型指針,新的ANSIC標(biāo)準(zhǔn)規(guī)定,該函數(shù)返回為void型指針,因此必要時(shí)要進(jìn)行類型轉(zhuǎn)換。它能向系統(tǒng)申請(qǐng)分配一個(gè)長(zhǎng)度為num_bytes(或size)個(gè)字節(jié)的內(nèi)存塊。

一般它需和free函數(shù)配對(duì)使用。free函數(shù)能釋放某個(gè)動(dòng)態(tài)分配的地址,表明不再使用這塊動(dòng)態(tài)分配的內(nèi)存了,實(shí)現(xiàn)把之前動(dòng)態(tài)申請(qǐng)的內(nèi)存返還給系統(tǒng)。

相關(guān)函數(shù)

calloc、realloc、free、_alloca。

與new的區(qū)別

從本質(zhì)上來(lái)說(shuō),malloc(Linux上具體實(shí)現(xiàn)可以參考man malloc,glibc通過(guò)brk()&mmap()實(shí)現(xiàn))是libc里面實(shí)現(xiàn)的一個(gè)函數(shù),如果在source code中沒(méi)有直接或者間接include過(guò)stdlib.h,那么gcc就會(huì)報(bào)出error:‘malloc’ was not declared in this scope。如果生成了目標(biāo)文件(假定動(dòng)態(tài)鏈接malloc),如果運(yùn)行平臺(tái)上沒(méi)有l(wèi)ibc(Linux平臺(tái),手動(dòng)指定LD_LIBRARY_PATH到一個(gè)空目錄即可),或者libc中沒(méi)有malloc函數(shù),那么會(huì)在運(yùn)行時(shí)(Run-time)出錯(cuò)。new則不然,是c++的關(guān)鍵字,它本身不是函數(shù)。new不依賴于頭文件,c++編譯器就可以把new編譯成目標(biāo)代碼(g++4.6.3會(huì)向目標(biāo)中插入_Znwm這個(gè)函數(shù),另外,編譯器還會(huì)根據(jù)參數(shù)的類型,插入相應(yīng)的構(gòu)造函數(shù))。

在使用上,malloc 和 new 至少有兩個(gè)不同: new 返回指定類型的指針,并且可以自動(dòng)計(jì)算所需要大小。比如:

int *p;
p = new int;
//返回類型為int *類型(整數(shù)型指針),分配大小為sizeof(int);

或:

int *parr;
parr = new int[100];
//返回類型為int *類型(整數(shù)型指針),分配大小為sizeof(int) * 100;

而 malloc 則必須要由我們計(jì)算字節(jié)數(shù),并且在返回后強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針。

int *p;
p = (int*)malloc(sizeof(int) * 128);
//分配128個(gè)(可根據(jù)實(shí)際需要替換該數(shù)值)整型存儲(chǔ)單元,
//并將這128個(gè)連續(xù)的整型存儲(chǔ)單元的首地址存儲(chǔ)到指針變量p中
double *pd = (double*)malloc(sizeof(double) * 12);
//分配12個(gè)double型存儲(chǔ)單元,
//并將首地址存儲(chǔ)到指針變量pd中

第一、malloc 函數(shù)返回的是 void * 類型。

對(duì)于C++,如果你寫成:p = malloc (sizeof(int)); 則程序無(wú)法通過(guò)編譯,報(bào)錯(cuò):“不能將 void* 賦值給 int * 類型變量”。

所以必須通過(guò) (int *) 來(lái)將強(qiáng)制轉(zhuǎn)換。而對(duì)于C,沒(méi)有這個(gè)要求,但為了使C程序更方便的移植到C++中來(lái),建議養(yǎng)成強(qiáng)制轉(zhuǎn)換的習(xí)慣。

第二、函數(shù)的實(shí)參為 sizeof(int) ,用于指明一個(gè)整型數(shù)據(jù)需要的大小。

需要注意一個(gè)特殊情況malloc(0),返回值可能是一個(gè)NULL或者一個(gè)有效的地址(可以安全的free,但是不能解引用)。注意malloc(-1)不是禁止的,參數(shù)為無(wú)符號(hào)類型,如果是負(fù)數(shù)可能會(huì)轉(zhuǎn)換成極大的正數(shù),最后一般會(huì)因?yàn)闆](méi)有足夠大的內(nèi)存塊而返回NULL。

在規(guī)范的程序中我們有必要按照這樣的格式去使用malloc及free:

type *p;
if(NULL == (p = (type*)malloc(sizeof(type))))
/*請(qǐng)使用if來(lái)判斷,這是有必要的*/
{
    perror("error...");
    exit(1);
}
.../*其它代碼*/
free(p);
p = NULL;/*請(qǐng)加上這句*/

malloc 也可以達(dá)到 new [] 的效果,申請(qǐng)出一段連續(xù)的內(nèi)存,方法無(wú)非是指定你所需要內(nèi)存大小。

比如想分配100個(gè)int類型的空間:

int *p = (int*)malloc(sizeof(int) * 100);
//分配可以放得下100個(gè)整數(shù)的內(nèi)存空間。

另外有一點(diǎn)不能直接看出的區(qū)別是,malloc 只管分配內(nèi)存,并不能對(duì)所得的內(nèi)存進(jìn)行初始化,所以得到的一片新內(nèi)存中,其值將是隨機(jī)的。

除了分配及最后釋放的方法不一樣以外,通過(guò)malloc或new得到指針,在其它操作上保持一致。

對(duì)其做一個(gè)特例補(bǔ)充

char *ptr;
if((ptr = (char*)malloc(0)) == NULL)
    puts("Gotanullpointer");
else
    puts("Gotavalidpointer");

此時(shí)可能會(huì)得到的是Got a valid pointer,也可能會(huì)得到Got a null pointer。

工作機(jī)制

malloc函數(shù)的實(shí)質(zhì)體現(xiàn)在,它有一個(gè)將可用的內(nèi)存塊連接為一個(gè)長(zhǎng)長(zhǎng)的列表的所謂空閑鏈表。調(diào)用malloc函數(shù)時(shí),它沿連接表尋找一個(gè)大到足以滿足用戶請(qǐng)求所需要的內(nèi)存塊。然后,將該內(nèi)存塊一分為二(一塊的大小與用戶請(qǐng)求的大小相等,另一塊的大小就是剩下的字節(jié))。接下來(lái),將分配給用戶的那塊內(nèi)存?zhèn)鹘o用戶,并將剩下的那塊(如果有的話)返回到連接表上。調(diào)用free函數(shù)時(shí),它將用戶釋放的內(nèi)存塊連接到空閑鏈上。到最后,空閑鏈會(huì)被切成很多的小內(nèi)存片段,如果這時(shí)用戶申請(qǐng)一個(gè)大的內(nèi)存片段,那么空閑鏈上可能沒(méi)有可以滿足用戶要求的片段了。于是,malloc函數(shù)請(qǐng)求延時(shí),并開(kāi)始在空閑鏈上翻箱倒柜地檢查各內(nèi)存片段,對(duì)它們進(jìn)行整理,將相鄰的小空閑塊合并成較大的內(nèi)存塊。如果無(wú)法獲得符合要求的內(nèi)存塊,malloc函數(shù)會(huì)返回NULL指針,因此在調(diào)用malloc動(dòng)態(tài)申請(qǐng)內(nèi)存塊時(shí),一定要進(jìn)行返回值的判斷。

Linux Libc6采用的機(jī)制是在free的時(shí)候試圖整合相鄰的碎片,使其合并成為一個(gè)較大的free空間。

程序示例

正常程序

typedef struct data_type{
    int age;
    char name[20];
}data;
data*bob=NULL;
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);
}
else
{
    printf("mallocerror!\n");
    exit(-1);
}  
free(bob);
bob=NULL;

輸出結(jié)果:Robert is 22 years old.

內(nèi)存泄漏實(shí)例

#include <stdio.h>
#include <malloc.h>
#define MAX 100000000int main(void)
{
    int *a[MAX] = {NULL};
    int i;
    for(i=0;i<MAX;i++)
    {
    a[i]=(int*)malloc(MAX);
    }
    return 0;
}

注:malloc申請(qǐng)之后沒(méi)有檢測(cè)返回值。

感謝各位的閱讀!關(guān)于malloc函數(shù)的使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

文章名稱:malloc函數(shù)的使用方法
文章出自:http://chinadenli.net/article16/ihpdgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、動(dòng)態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)商城網(wǎng)站、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化