溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用remalloc的注意事項(xiàng)有哪些

發(fā)布時(shí)間:2021-08-09 11:57:59 來(lái)源:億速云 閱讀:112 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)使用remalloc的注意事項(xiàng)有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include <malloc.h>

功能:改變mem_address所指內(nèi)存區(qū)域的大小為newsize長(zhǎng)度。

說(shuō)明:如果重新分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。

下面再看MSDN中對(duì)realloc()函數(shù)的描述:

realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged. The return value points to a storage space that is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value.

這段E文基本上是在講realloc()的返回值的。realloc()函數(shù)的返回值是void *型的。

有下面三種情況:

1、返回void * 指針,調(diào)用成功。Void *型的指針指向新分配的內(nèi)存空間。在需要的情況下可以再對(duì)這個(gè)指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)換成你需要的類型的指針。如果傳入的第一個(gè)指針參數(shù)為NULL,則該函數(shù)等同與malloc函數(shù)。

2、返回NULL,當(dāng)需要擴(kuò)展的大?。ǖ诙€(gè)參數(shù))為0并且第一個(gè)參數(shù)不為NULL,此時(shí)原內(nèi)存被“freed”掉了。

我們知道,realloc是從堆上分配內(nèi)存的,當(dāng)擴(kuò)大一塊內(nèi)存空間時(shí), realloc()試圖直接從堆上現(xiàn)存的數(shù)據(jù)后面的那些字節(jié)中獲得附加的字節(jié),如果能夠滿足,自然天下太平;可如果數(shù)據(jù)后面的字節(jié)不夠的話,那么就使用堆上第一個(gè)有足夠大小的自由塊,現(xiàn)存的數(shù)據(jù)然后就被拷貝至新的位置,而老塊則放回到堆上。返回值指向新分配的內(nèi)存地址。

由于在這其中可能會(huì)發(fā)生數(shù)據(jù)的移動(dòng),因此我們應(yīng)該盡力避免下面的用法。

…………………………

#include <malloc.h>

char   *p,*q;

p = (char * ) malloc (10);

q=p;

p = (char * ) realloc (p,20);

…………………………

在這種情況下,如果發(fā)生了數(shù)據(jù)的移動(dòng),p指向了新分配的內(nèi)存地址,但是指針q還依然指向原先的內(nèi)存地址,而原先的那部分內(nèi)存已經(jīng)在realloc函數(shù)中free掉了,因此指針q成了“野指針”,指向了一塊未知的內(nèi)存區(qū)域,這是很危險(xiǎn)的。類似的,我們也應(yīng)該盡量避免下面這種情況的使用。

…………………………

q = (char * ) realloc (p,20);

………………………

與第一種情況類似,如果發(fā)生了數(shù)據(jù)的移動(dòng),q指向了新分配的內(nèi)存地址,而指針p還依然指向原先的內(nèi)存地址,此時(shí)p成了野指針。如果不得以非得這樣使用的話(估計(jì)這種情況是不存在的),我們也應(yīng)該緊跟此后將指針p置為NULL。

…………………………

q = (char * ) realloc (p,20);

p = NULL;

關(guān)于“使用remalloc的注意事項(xiàng)有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI