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;
}

image-20210309165106299

错误3

其实这个错误都会在 malloc calloc realloc 出现

如果我们不小心修改了ptr的指向,再去释放 free(ptr);就会报错。

结语

c语言天下第一

努力成长的程序员