C语言--动态内存函数记录

本文详细介绍了C语言中动态内存管理的三个关键函数:malloc、calloc和realloc。malloc用于动态分配内存,free用于释放内存,calloc在分配内存时会进行初始化。realloc则可以调整已分配内存的大小。示例代码展示了如何使用这些函数来创建、使用和调整内存空间,并强调了释放内存后将指针置为NULL的重要性。
摘要由CSDN通过智能技术生成

目录

1.malloc和free

2.calloc

3.realloc


1.malloc和free

        malloc是c语言提供地动态开辟函数。

void* malloc (size_t size);

        malloc向内存申请一块连续可用地空间,并返回这个空间的指针,如果开辟失败返回的是空指针。参数size是表示要开辟空间的大小,size = 0的话,malloc的行为是未定义的,取决于不同的编译器。返回值是void*类型,因此在使用时需要自己根据需要定义空间的类型。

        由于malloc是在堆区上开辟空间,在使用结束后并不会自己将内存空间还给操作系统。所以c语言提供了free函数来释放开辟的内存空间。

void free (void* ptr);

        如果free参数的指针不是动态开辟空间的,那么free的行为未定义。

        free(NULL)相当于什么也不操作

        下面来尝试使用一下,用malloc函数开辟一块空间来存储int型的数组,同时在使用完这块空间后,记得free释放空间。还要特别注意的是,空间释放完后的ptr指针仍指在原来的位置,我们要及时将他指向空指针,以免出现野指针的风险。

int main()
{
	int num = 0;
	scanf("%d", &num);
	int* pt = (int*)malloc(num * sizeof(int));
	int i = 0;
	for (i = 0; i < num; i++)
	{
		*(pt + i) = i;
	}
	for (i = 0; i < num; i++)
	{
		printf("%d ", *(pt+i));
	}
    free(pt);
	pt = NULL;
	return 0;
}

2.calloc

        calloc的作用其实与malloc相同,也是开辟一块连续可用的空间。唯一的区别就是calloc在开辟完之后会对这块空间进行初始化。

void* calloc (size_t num, size_t size);

        将calloc开辟的空间直接打印,我们会看到空间内已经赋值好0。

int main()
{
	int* ptr = (int*)calloc(10 ,sizeof(int));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(ptr + i));
	}
	free(ptr);
	ptr = NULL;
	return 0;
}

3.realloc

        有时会我们发现之前申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了有一个合理的内存,我们可以使用realloc函数做到对动态开辟内存大小的调整。 

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

        ptr为要调整的空间地址,size是新的大小,返回一个新的内存空间地址。由于可能之前空间的后续未使用空间不能满足重新调整空间大小的要求,需要从另一块空间开辟,所以返回的地址不一定是先前空间的地址。

int main()
{
	int i = 0;
	int* ptr = (int*)malloc(10 * sizeof(int));
	if (NULL == ptr)
	{
		return -1;
	}
	for (i = 0; i < 10; i++)
	{
		ptr[i] = i;
	}
	ptr = (int*)realloc(ptr, 20*sizeof(int));
	if (NULL == ptr)
	{
		return -1;
	}
	for (i = 10; i < 20; i++)
	{
		ptr[i] = i;
	}
	for (i = 0; i < 20; i++)
	{
		printf("%d ", ptr[i]);
	}
	free(ptr);
	ptr = NULL;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值