动态内存管理:realloc扩容(缩容)函数详解

举报
念君思宁 发表于 2023/02/10 20:31:06 2023/02/10
【摘要】 动态内存管理:realloc扩容(缩容)函数详解

当一个空间在使用着,使用着,突然间发现,内存空间不足,这个时候,是重新更改代码呢??还是想要对原先的内存进行扩容呢??这个答案肯定是显而易见的:进行扩容!!当你面临着几千行的代码,怎可能会进行重新返回去写呢??

下面笔者就带领各位老铁,来欣赏一下:realloc函数的使用:

void* realloc (void* ptr, size_t size)

将ptr指向的那段空间,设置为:size个字节的大小!!

列如:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
	int* p = (int*)malloc(40);
	//扩容(增加空间)
	int* ptr = (int*)realloc(p, 80);
	if (ptr != NULL)
	{
		p = ptr;
		ptr = NULL;
	}
	//当realloc开辟失败的时候,返回NULL
 
 
	//释放
	free(p);
	p = NULL;
}

上述代码中:重新定义了 ptr(int* ptr = (int*)realloc(p, 80)  ) :原因为:原本p指向40个字节的起始位置,但是当realloc开辟失败的时候,返回NULL,则p指向那40个空间也会出现错误,则需要通过ptr来进行判断一下!!


对于realloc函数在使用的情况中,我们必须要知道的为:

1.realloc函数的出现让动态内存管理更加灵活!!

2.有时候我们发现申请的空间太小了,有时候我们又会觉得申请的空间过大了!那么为了合理的使用内存,我们一定会对内存大小做灵活的调整,那么realloc函数就可以做到对动态内存大小的调整!!

函数的原型为:

void* realloc (void* ptr, size_t size)

3.ptr是要调整内存的地址

4.size是调整之后的大小,单位为字节

5.返回值为:调整之后的起始位置!

6.这个函数,在调整原内存空间的基础上,还会将原来内存中的数据移动到新的空间!

7.realloc在调整内存空间是存在2中情况!!

情况1.原有空间之后有在足够大的空间:

 在这个情况的时候,要扩容内存,就直接在原有内存之后,追加空间,原来的数据不会发生改变!!

情况2:原有空间之后,没有足够大的空间!

在这个情况的时候,原有空间之后没有足够多的空间时,扩展的方法为:在堆空间上另找一共合适大小的连续空间来使用!这样的话,函数的返回值就是一个新的内存地址!!

由于上述的两种情况,realloc函数的使用,就需要注意一下了!!

 简单写一个realloc函数的使用列子,供大家参考一下:

 
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
 
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\n");
 
	//增加空间
	int* ptr = (int*)realloc(p, 80);
	//当realloc开辟失败的时候,会返回NULL
	if (ptr != NULL)
	{
		p = ptr;
		ptr = NULL;
	}
	for (i = 10; i < 20; i++)
	{
		*(p + i) = i;
	}
	for (i = 10; i < 20; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

代码的运行结果为:

 另外:在realloc函数在使用的时候,:realloc(NULL,40)相当于:malloc(40)

本文就大致到此结束,笔者想要表达的内容已经概述完毕,有疑惑的各位lao't

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。