C语言 realloc()使用的误区
我在 《 数据结构 线性表以及顺序表实现线性表 》 这一篇文章使用 realloc 函数 发现了几个误区,特此记录一下。
realloc() 函数
位于 stdlib.h
库中
函数原型 : void* realloc(void* ptr, unsigned newsize);
realloc()
会将 ptr 所指向的内存块重新分配大小为 size,并将ptr指针返回,如果分配失败 返回NULL。
主要用如下用法 :
- 如果ptr为NULL,则函数相当于malloc(new_size)
- 如果 ptr 所占的空间比 newsize 小, 增加ptr空间到newsize 并且把数据也拷贝过去
- 如果 ptr 所占的空间比 newsize 大 ,减小ptr的空间到newsize 只保留到newsize内的数据
- 如果 ptr 所占的空间比 newsize 相等,啥都不做。
- 如果newsize==0,那么相当于调用 free(ptr),返回一个空指针。
- 如果分配空间失败,返回NULL,不对 ptr进行操作
一个简简单单的 realloc被赋予了这么多功能,也是蛮厉害的。
但是 使用起来很容易出错的。
错误1
错误
ptr=realloc(ptr,Newsize*(sizeof(ElemType)));
if(!ptr)
{
//错误处理
}
这个就是我使用起来的第一个错误,当分配空间失败的时候,会把ptr覆盖成NULL,就会丢失了ptr内存块的数据
所以正确的方法是:
ElemType* new_base = realloc(ptr,Newsize*(sizeof(ElemType)));
if(!new_base)
{
//错误处理
}
ptr=new_base;
错误2
realloc () 是在原有空间上修改
ElemType* new_base = realloc(ptr,Newsize*(sizeof(ElemType)));
此时 new_base 和ptr为同一段空间
我们可以小小验证一下
# include <stdio.h>
#include <stdlib.h>
void test()
{
int* p = (int*)malloc(10 * sizeof(int));
int* new_base =(int*) realloc(p, 20 * sizeof(int));
printf("p内存块的地址为 %p \n",p);
printf("realloc重新分配的地址为 %p\n", new_base);
getchar();
}
int main()
{
test();
return 0;
}
错误3
其实这个错误都会在 malloc calloc realloc 出现
如果我们不小心修改了ptr的指向,再去释放 free(ptr);就会报错。
结语
c语言天下第一