第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數(shù)據(jù)結(jié)構(gòu)中 malloc 和 realloc 有什么區(qū)別?

數(shù)據(jù)結(jié)構(gòu)中 malloc 和 realloc 有什么區(qū)別?

數(shù)據(jù)結(jié)構(gòu)中 malloc 和 realloc 有什么區(qū)別?
查看完整描述

1 回答

?
莫回無

TA貢獻1865條經(jīng)驗 獲得超7個贊

三個函數(shù)的申明分別是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t?numElements,?size_t?sizeOfElement);
都在stdlib.h函數(shù)庫內(nèi)
它們的返回值都是請求系統(tǒng)分配的地址,如果請求失敗就返回NULL
malloc用于申請一段新的地址,參數(shù)size為需要內(nèi)存空間的長度,如:
char* p;
p=(char*)malloc(20);
calloc與malloc相似,參數(shù)sizeOfElement為申請地址的單位元素長度,numElements為元素個數(shù),如:
char* p;
p=(char*)calloc(20,sizeof(char));
這個例子與上一個效果相同
realloc是給一個已經(jīng)分配了地址的指針重新分配空間,參數(shù)ptr為原有的空間地址,newsize是重新申請的地址長度
如:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);
注意,這里的空間長度都是以字節(jié)為單位。
C語言的標準內(nèi)存分配函數(shù):malloc,calloc,realloc,free等。
malloc與calloc的區(qū)別為1塊與n塊的區(qū)別:
malloc調(diào)用形式為(類型*)malloc(size):在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為“size”字節(jié)的連續(xù)區(qū)域,返回該區(qū)域的首地址。
calloc調(diào)用形式為(類型*)calloc(n,size):在內(nèi)存的動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域,返回首地址。
realloc調(diào)用形式為(類型*)realloc(*ptr,size):將ptr內(nèi)存大小增大到size。
free的調(diào)用形式為free(void*ptr):釋放ptr所指向的一塊內(nèi)存空間。
C++中為new/delete函數(shù)。

如果調(diào)用成功,函數(shù)malloc()和函數(shù)calloc()都將返回所分配的內(nèi)存空間的首地址。

函數(shù)malloc()和函數(shù)calloc() 的主要區(qū)別是前者不能初始化所分配的內(nèi)存空間,而后者能。如果由malloc()函數(shù)分配的內(nèi)存空間原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分內(nèi)存曾經(jīng)被分配過,則其中可能遺留有各種各樣的數(shù)據(jù)。也就是說,使用malloc()函數(shù)的程序開始時(內(nèi)存空間還沒有被重新分配)能正常進行,但經(jīng)過一段時間(內(nèi)存空間還已經(jīng)被重新分配)可能會出現(xiàn)問題。

函數(shù)calloc() 會將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數(shù)類型的元素分配內(nèi)存,那麼這些元素將保證會被初始化為0;如果你是為指針類型的元素分配內(nèi)存,那麼這些元素通常會被初始化為空指針;如果你為實型數(shù)據(jù)分配內(nèi)存,則這些元素會被初始化為浮點型的零。

malloc 向系統(tǒng)申請分配指定size個字節(jié)的內(nèi)存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規(guī)定,void* 類型可以強制轉(zhuǎn)換為任何其它類型的指針。
從函數(shù)聲明上可以看出。malloc 和 new 至少有兩個不同: new 返回指定類型的指針,并且可以自動計算所需要大小。比如:
int *p;
p = new int; //返回類型為int* 類型(整數(shù)型指針),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類型為 int* 類型(整數(shù)型指針),分配大小為 sizeof(int) * 100;
而 malloc則必須由我們計算要字節(jié)數(shù),并且在返回后強行轉(zhuǎn)換為實際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函數(shù)返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強制轉(zhuǎn)換。
第二、函數(shù)的實參為 sizeof(int) ,用于指明一個整型數(shù)據(jù)需要的大小。如果你寫成:
int* p = (int *) malloc (1);
代碼也能通過編譯,但事實上只分配了1個字節(jié)大小的內(nèi)存空間,當你往里頭存入一個整數(shù),就會有3個字節(jié)無家可歸,而直接“住進鄰居家”!造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。
malloc 也可以達到 new [] 的效果,申請出一段連續(xù)的內(nèi)存,方法無非是指定你所需要內(nèi)存大小。
比如想分配100個int類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數(shù)的內(nèi)存空間。
另外有一點不能直接看出的區(qū)別是,malloc只管分配內(nèi)存,并不能對所得的內(nèi)存進行初始化,所以得到的一片新內(nèi)存中,其值將是隨機的。



查看完整回答
反對 回復 2018-12-19
  • 1 回答
  • 0 關注
  • 911 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號