使用remalloc的注意事项说明(必看篇)
原型:externvoid*realloc(void*mem_address,unsignedintnewsize);
用法:#include<malloc.h>
功能:改变mem_address所指内存区域的大小为newsize长度。
说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
下面再看MSDN中对realloc()函数的描述:
reallocreturnsavoidpointertothereallocated(andpossiblymoved)memoryblock.ThereturnvalueisNULLifthesizeiszeroandthebufferargumentisnotNULL,orifthereisnotenoughavailablememorytoexpandtheblocktothegivensize.Inthefirstcase,theoriginalblockisfreed.Inthesecond,theoriginalblockisunchanged.Thereturnvaluepointstoastoragespacethatisguaranteedtobesuitablyalignedforstorageofanytypeofobject.Togetapointertoatypeotherthanvoid,useatypecastonthereturnvalue.
这段E文基本上是在讲realloc()的返回值的。realloc()函数的返回值是void*型的。
有下面三种情况:
1、返回void*指针,调用成功。Void*型的指针指向新分配的内存空间。在需要的情况下可以再对这个指针进行强制类型转换,转换成你需要的类型的指针。如果传入的第一个指针参数为NULL,则该函数等同与malloc函数。
2、返回NULL,当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL,此时原内存被“freed”掉了。
我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时,realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;可如果数据后面的字节不够的话,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上。返回值指向新分配的内存地址。
由于在这其中可能会发生数据的移动,因此我们应该尽力避免下面的用法。
…………………………
#includechar*p,*q; p=(char*)malloc(10); q=p; p=(char*)realloc(p,20);
…………………………
在这种情况下,如果发生了数据的移动,p指向了新分配的内存地址,但是指针q还依然指向原先的内存地址,而原先的那部分内存已经在realloc函数中free掉了,因此指针q成了“野指针”,指向了一块未知的内存区域,这是很危险的。类似的,我们也应该尽量避免下面这种情况的使用。
…………………………
q=(char*)realloc(p,20);
………………………
与第一种情况类似,如果发生了数据的移动,q指向了新分配的内存地址,而指针p还依然指向原先的内存地址,此时p成了野指针。如果不得以非得这样使用的话(估计这种情况是不存在的),我们也应该紧跟此后将指针p置为NULL。
…………………………
q=(char*)realloc(p,20); p=NULL;
以上这篇使用remalloc的注意事项说明(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。