直接给实例,然后围绕实例来谈:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char *p = NULL;
char *q = NULL;
int ret = 0;
do
{
p = (char *) malloc (8);
if (NULL == p)
{
printf ("malloc() error\n");
ret = -1;
break;
}
q = (char *) realloc (p, 16);
if (NULL == q) /* 内存分配失败 */
{
printf ("realloc error\n");
ret = -1;
break;
}
else /* 内存分配成功 */
{
p = q;
q = NULL;
}
} while (0);
if (NULL != p)
{
free (p);
p = NULL;
}
return ret;
}
要点:
1、realloc() 的参数一必须是经过malloc()等动态分配函数分配的指针
2、realloc() 的参数二一定要比已分配的空间大,不然会发生数据丢失错误
3、realloc() 扩展内存时,如果当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。
4、如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。
补充说明3和4:也就是说 realloc 有时候会产生一个新的内存地址有的时候不会。所以在分配完成后,需要对其值进行判断。
当分配不成功时,返回的指针为NULL,如果不区分p和q,统一用p去接收,此时p将重新指向NULL,原来的内存将丢失,产生内存泄露。
综上,就有了上面的简单实例。