初识动态内存管理

2024-01-07 21:54:38

前言:? ?

????????我们都知道,内存分为几个区——栈区、堆区、静态区、常量区、代码区,我们在写代码的时候经常会遇到栈溢出这个问题,是因为在程序运行之前,我们无法准确的知道要分配多少空间给程序,所以说很容易造成栈溢出或者导致内存被白白的浪费——但是,动态内存管理,就可以帮助我们解决这个问题——它可以在堆区开辟出一些区域来分配给程序,所以说能够在一定程度上避免栈溢出的问题(strack overflow)还可以根据用户的需求更加灵活的分配宝贵的内存。

malloc函数:

? ? ? ? 我用我的方式理解,这是一个最基本的动态内存分配函数,它直接在堆区开辟一块内存,然后返回空指针给程序,我们需要用一个有类型的指针对其接收,下面来举个例子:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//用strerror函数的头文件
#include<errno.h>//用erron函数的头文件
#include<string.h>//用于报错的头文件
int main()
{
	int* p = (int*)malloc(40);//malloc函数申请40字节的空间,用p来接受
	if (p == NULL)//判断,如果没有申请成功,则p为空指针
	{
		printf("p:%s", strerror(errno));//将错误信息打印
		return 1;//如果错了就不执行了,直接终止代码,并且返回1
	}
	int i = 0;//如果申请成功
	for (i = 0; i < 10; i++)//则给p初始化
	{
		*(p + i) = i + 1;
	}
	for (i = 0; i < 10; i++)//将p打印出来看看
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

?

? ? ? ? 我们发现,这样是成功的,malloc函数就是像这样使用的,值得注意的是,malloc函数返回的是空指针,我们先要用强制类型转换将其转为你需要的指针类型再使用,并且应该要养成一个好习惯,那就是先进行判断,是否申请成功,如果没有申请成功,应该打印错误信息并且终止程序,以免导致内存泄漏或者本来的空间出现问题。

free函数:

? ? ? ? 内存是十分宝贵的,我们申请了内存,应该要及时的释放它,不然就会造成浪费,有可能你会觉得你的内存很大,才申请几十个字节,完全不影响,但其实不然;一方面是节约资源,另一方面,如果不释放的话,有可能会对于你后面的程序有影响,导致一些你很难发现的错误(bug)。所以说为了及时释放内存,我们要用free函数,它用法十分简单:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//用strerror函数的头文件
#include<errno.h>//用erron函数的头文件
#include<string.h>//用于报错的头文件
int main()
{
	int* p = (int*)malloc(40);//malloc函数申请40字节的空间,用p来接受
	if (p == NULL)//判断,如果没有申请成功,则p为空指针
	{
		printf("p:%s", strerror(errno));//将错误信息打印
		return 1;//如果错了就不执行了,直接终止代码,并且返回1
	}
	int i = 0;//如果申请成功
	for (i = 0; i < 10; i++)//则给p初始化
	{
		*(p + i) = i + 1;
	}
	for (i = 0; i < 10; i++)//将p打印出来看看
	{
		printf("%d ", *(p + i));
	}
    free(p);
    p=NULL;
	return 0;
}

? ? ? ? 我们只需要在上面的代码后面加上free(你用来接收空间的变量名),就可以将申请的空间释放了,但是值得注意的是:虽然你释放了,但是p的地址还是原来的申请的空间的地址,如果你后面再对p有什么操作,极大可能将会影响到存入原来地址的新数据,所以说我们要让p等于一个空指针,这样它的地址才不会不变,也就不会对程序产生影响了。

? ? ? ? 后面还有几个函数,下回分解。?

? ? ? ??


?

文章来源:https://blog.csdn.net/Aishangyuwen/article/details/135444276
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。