realloc函数的使用

realloc()函数是一个C语言的库函数,定义在头文件<stdlib.h>里。之前一直忽略这个函数的存在,直到最近看The Practice of Programming才学会使用这个函数,小结一下。先来看看realloc()函数的原型。

void *realloc(void *p, size_t size);

realloc()函数的作用是调整malloc()函数动态分配的内存空间大小。如果操作是扩大分配,且调用成功,则原来部分的内容被保留;如果操作是减少分配,且调用成功,则靠后面部分的内容丢失,而前面部分的内容仍保留。

有了这些特点,可以使用realloc()函数实现动态数组,类似C++的vector的功能,开发者无需触碰底层的内存管理问题。我以前曾经想过先使用free()函数释放原来分配的内存,然后重新调用malloc()分配更大的内存。但是实践证明,这种方法效率很低,因为每次都要拷贝内存中原有的内容。

使用realloc()函数,要注意不能马上用原来的指针变量保存新的返回值,如下面的例子。

p = realloc(p, newsize);

万一realloc()分配失败,返回NULL,则旧的内存空间指针会丢失。正确的使用方法如下。

void *tempPtr;
tempPtr = realloc(p, newsize);
if (tempPtr == NULL) {
    /* Handle error */
}
p = tempPtr;

先使用一个临时指针保存重新分配的结果,并且检查是否NULL,然后如果没问题再赋给原来的指针变量。

Advertisements

一个有关“realloc函数的使用”的想法

  1. 可唔可以俾D实际嘅数据,比较一下realloc和malloc,memcpy,free两种方法的性能差别?
    另:如果我不需要保留原有数据,realloc是不是会比malloc,free更慢?

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s