动态内存管理: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

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/127322369
今日推荐