C语言——动态内存管理

本文详细讲解了C语言中动态内存管理的核心函数malloc、free、calloc和realloc,以及它们在程序中的应用和内存调整策略。
摘要由CSDN通过智能技术生成

引言——为什么要有动态内存管理

        之前学习过如int achar arr[10]等开辟空间的方式,其特点是:开辟的空间大小是固定的,一旦确定了大小就不能调整,有时候程序需要根据实际情况改变空间大小。因此,C语言提供了动态内存管理,可以根据需求申请释放空间。以下是有关动态内存分配的函数


一、malloc和free

size是开辟内存块的大小,以字节为单位

malloc申请到空间后,直接返回这块空间的起始地址,不会初始化空间的内容

malloc申请的内存空间,当程序退出时,还给操作系统;当程序不退出时,动态申请的内存,不会主动释放,需要free函数来释放

malloc和free的头函数为include <stdlib.h>

#include <stdlib.h>
int main()
{
	int* ptr = NULL;
	ptr = (int*)malloc(10 * sizeof(int));//开辟10*4字节空间
	if (NULL == ptr)//判断ptr指针是否为空
	{
		perror("malloc");
        return 1;
	}

	free(ptr);//释放ptr所指向的动态内存
	ptr = NULL;
	return 0;
}

二、calloc

为num个大小为size的元素开辟一块空间,并将每个字节初始化为0

与malloc相比,calloc会将字节初始化为0,malloc只开辟空间

#include <stdlib.h>
int main()
{
	int* ptr = NULL;
	ptr = (int*)calloc(10, sizeof(int));//开辟10*4字节空间
	if (NULL == ptr)//判断ptr指针是否为空
	{
		perror("calloc");
		return 1;
	}
	//打印数据
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ptr[i]);
	}

	//释放
	free(ptr);//释放ptr所指向的动态内存
	ptr = NULL;

	return 0;
}

 输出结果:0 0 0 0 0 0 0 0 0 0

三、realloc

realloc可以对动态开辟内存的大小进行调整

ptr是要调整的内存地址

size是调整之后的内存大小

realloc在调整内存空间时存在两种情况

情况1:原空间后面有足够的空间

情况2:原空间后面空间不足,需要开辟新空间

#include <stdlib.h>
int main()
{
	int* p = NULL;
	p = (int*)malloc(10* sizeof(int));//开辟10*4字节空间
	if (NULL == p)//判断ptr指针是否为空
	{
		perror("malloc");
		return 1;
	}
	//初始化为1~10
	int i;
	for (i = 0; i < 10; i++)
	{
		p[i] = i;
	}
	//增加空间
	int* ptr = (int*)realloc(p, 80);
	if (ptr != NULL)
	{
		p = ptr;
		ptr = NULL;
	}
	else
	{
		perror("realloc");
		return 1;
	}
	//打印数据
	for (i = 0; i < 20; i++)
	{
		printf("%d\n", p[i]);
	}
	//释放
	free(p);//释放p所指向的动态内存
	p = NULL;

	return 0;
}

输出结果:0 1 2 3 4 5 6 7 8 9 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451

注:开辟完判断是不是空指针,用完释放,置空指针

       动态内存申请的空间,不会因为出了作用域就自动销毁(还给操作系统)!

free(p);

p=NULL;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值