众所周知,realloc()
的做用就是将已经 malloc 的内存块,从新扩展加长。当你并无使用高端的内存池的时候,临时从堆中申请加大内存,这是颇有用的。可是如何正确地使用 realloc() 呢?html
realloc 用法程序员
#include <stdlib.h> void *realloc(void *ptr, size_t size);
传入参数:
(1)须要被扩展大小的内存指针
(2)扩展后的大小(注意不是添加的大小)函数
返回参数:
新的指针ui
长篇大论放后面,咱们先上代码:spa
uint8_t *pMemToBeRealloc = malloc(1024); size_t memSize = 1024; ... /* start realloc */ uint8_t *pMemBackup = pMemToBeRealloc; /* 将 realloc 以前的内存地址备份一下 */ pMemToBeRealloc = realloc(pMemToBeRealloc, 2048); if (pMemToBeRealloc) { /* realloc 成功 */ LOG_DEBUG("Memory had been extent to 2048."); pMemBackup = NULL; memSize = 2048; } else { /* realloc 失败了,这个时候返回的是 NULL */ LOG_ERROR("Oh no, realloc() failed: %s.", strerror(errno)); pMemToBeRealloc = pMemBackup; memSize = 1024; } ...
当 realloc()
返回 NULL 的时候,表示内存扩展动做失败了。但这个时候,原来的内存并无被释放
,因此有必要把原来的内存预先备份下来。至于失败的时候要怎么处理,那就是程序员本身的事情了,这没有标准方案。指针
当 realloc()
返回非零值时呢,表示realloc是成功的。此时不论返回值是多少,程序都不须要对原来的内存地址值做特殊操做
。code
为何这么说呢?主要是参考资料里面没有把一个问题说清楚:htm
pMemToBeRealloc == pMemBackup
的状况,那说明只是在原来的内存基础上日后扩展就行了,这是最简单的状况pMemToBeRealloc != pMemBackup
呢?这很容易让人误解为,须要调用一次 free(pMemBackup)。这是错误的,由于这个动做,realloc 会自动帮你作了,不要多此一举!BTW
,我的还建议注意一个地方:从 man 手册上面看,虽然对于 malloc() 返回的内存,大部分标准库会初始化为全零,可是对于 realloc() 扩展的部分,则不必定。
不过保险起见,应该是对于 malloc() 和 realloc() 返回的内存内容,都不要相信它们都已经被初始化为0
才好。blog