C语言-realloc函数的使用

语法格式

1. `realloc`

函数用于动态地改变之前分配的内存块的大小。其函数原型如下:


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

- `ptr`: 指向之前分配的内存块的指针。如果 `ptr` 为 `NULL`,那么 `realloc` 行为与 `malloc` 相同。
- `size`: 新分配的大小(以字节为单位)。
`realloc` 可以调整内存块的大小,如果新的大小比原来小,那么内存块可能会被移动。如果新的大小比原来大,那么内存块会尝试扩展。如果扩展失败,那么原来的内存块会被保留,只是其大小变为新的大小。`realloc` 返回一个指向调整大小后的内存块的指针。如果调整大小失败,则返回 `NULL`。
在使用这些函数时,应当总是检查返回的指针是否为 `NULL`,以避免潜在的空指针引用错误。并且在使用 `calloc` 或 `realloc` 分配的内存后,应当在不再需要时使用 `free` 函数来释放内存,以避免内存泄露。

———————————————————————————————————————————

realloc函数的使用 

这个函数的代码格式可以理解为 ,你之前malloc或者calloc申请的空间是p指针进行接收的,OK此时你想对这个空间进行空间的扩展,那此时的ptr也就是p指针变量,size也就是你需要的实际空间,这里的空间不是扩展的空间,而是实际的空间
void *realloc(void *ptr, size_t size);

也就是realloc(p,40)

之前我们p开辟的是20的空间 ,这里我们实际需要的是40的空间,这不是再开辟40空间,而是一共40 的空间。

下面解释一下为什么

———————————————————————————————————————————

realloc函数扩展空间的原理

 realloc函数扩展空间几乎就是两种模式

1. 直接在原内存空间的基础上进行扩展内存

2. 把原空间的内存复制到新的内存空间,建立一个更大的内存空间,需要知道的是,只要是进行内存的复制,那么就有可能导致复制失败,从而导致数据丢失。

所以实际使用的时候,我们还是需要进行判断语句的。

 如图1

如图2 

———————————————————————————————————————————

realloc代码解析 

首先我们创建一个空间 ,然后进行调整 

因为这里使用的时候 是有可能导致开辟空间错误,导致地址的丢失,所以我们进行判断,也就是主动的找一个指针变量指向新开辟的地址,只要指向的空间不是空指针,那么也就是可以满足条件,然后进行一个二次赋值

最后,不使用的时候进行申请空间的清理,防止内存空间的泄露

———————————————————————————————————————————

realloc代码 

int main()
{
	//malloc不初始化开辟空间
    //开辟20个字节的空间大小 
	int* p = (int*)calloc(5 , sizeof(int));
	if (p == NULL)
	{
		perror("malloc:");//这里是打印错误信息,
		return 1;
	}
	for (int i = 0; i < 5; i++)//这里是打印出来开辟的空间 赋值之后进行打印 
	{
		//*(p + i) = i + 1;//这里是进行赋值 赋值从1开始
		printf("%d ", *(p + i));//这里是打印出来
	}
	free(p);//这里进行指针的释放
	p = NULL;//防止野指针的问题,我们指向空指针



	//首先我们已经开辟动态内存空间 但是不能满足我们的需求,那么此时我们就用realloc进行空间的扩展
	//依旧是采取强制类型转化,然后我们这里是延伸到40个字节的空间
	//因为我们知道,开辟空间的时候可能会导致内存空间的扩展失败
	//所以我们不能直接p=realloc(int*)realloc(p, 10 * sizeof(int)); 
	//而是进行先搞一个新的指针变量,确定成功了,再进行赋值
	//也就是
	int* ptr = (int*)realloc(p, 10 * sizeof(int));
	if (ptr == NULL)
	{
		perror("realloc:");//打印错误信息如果是空指针
		return 1;
	}
	p = ptr;
	for (int i = 0; i < 10; i++)
	{
		*(p + i) = 0;
		printf("%d ", *(p + i));
	}
	free(p);
	p = NULL;
	return 0;
}

这里是15个0 

因为calloc也打印5个0 

不要误解

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值