首页 > 系统相关 >动态内存管理

动态内存管理

时间:2024-12-17 11:29:34浏览次数:6  
标签:10 malloc 管理 int 释放 free 动态内存 NULL

一、malloc 和  free

malloc 函数负责向内存申请空间,free负责释放空间,它俩是一对   <stdlib.h>

molloc 申请 size 个字节大小的空间,这块空间是没有被初始化的,

返回类型,如果申请成功,将申请的地址返回,如果失败,返回NULL

free 用于释放 先前malloc、calloc、realloc 申请的空间;

如果 ptr指向的不是它仨申请的空间,会❌

如果 ptr 是空指针,啥都不会做,

释放后,不会改变ptr的值,也就是,它任然记得这块地址

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>

// malloc(申请空间)和 free(释放空间)
int main()
{
	int arr[10] = { 0 }; // 在栈区开辟的不可改变的空间

	int* p = (int*)malloc(40);// 在堆区开辟的空间 40字节

	// 打印申请失败的原因
	if (p == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	int i = 0;
	// 赋值
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i + 1;
	}
	//打印
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	//释放
	free(p);
	// 将p指向的内存空间还给内存,但是还记得地址
	p = NULL;

	return 0;
}

二、calloc 函数

用法和malloc 类似,num是元素个数,size是每个元素的大小(字节),开辟空间时,初始化为0

返回值和malloc函数一样,成功--开辟空间首地址,失败--NULL

int main()
{
	// 申请10个int型大小的 空间,并且全部初始化为0
	int* p=(int *)calloc(10, sizeof(int));

	for (int i = 0; i < 10; i++)
	{
		printf("%d ", *(p + 1));
	}

	//0 0 0 0 0 0 0 0 0 0

    free(p);

	return 0;
}

三、realloc函数

调整已申请的空间的大小

ptr 是我们要调整的,size是要调整到的大小,返回的是调整之后的地址,可能改变,也可能不变

int main()
{
	int i = 0;
	int* p=(int*)malloc(40);

	// 赋值
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i + 1;
	}
	putchar('\n');

	//扩容
	// 防止返回的是空指针,所以用另外指针接收 realloc返回的地址
	// 将p指向的空间 扩容到 80 字节
	int* tp = (int*)realloc(p, 80);
	if (tp != NULL)
	{
		p = tp;
	}

	//将扩容后面的赋值 0
	memset(p + 10, 0, 40);

	for (i = 0; i < 20; i++)
	{
		printf("%d ", *(p + i));
	}

	// 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0
    //释放
    free(p);

    p=NULL;

	return 0;
}

  当 realloc函数接收的是NULL(空指针),它的作用就相当于malloc函数

     realloc(NULL,40) == malloc(40)   开辟40个字节大小的空间

四、常见的错误

1、对NULL指针的解引用操作

使用malloc 、calloc等函数时,有可能返回的是空指针(NULL),使用的时候最好先判断一下

int main()
{
	int* p = (int*)malloc(40);

	// 不确定p是不是 NULL,直接解引用容易出现问题
	//最好先进行判断是不是空指针

	/*if (p == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}*/

	*p = 10;

	free(p);
    p=NULL;

	return 0;
}

2、对动态开辟空间的越界访问

void test()
{
	int* p = (int*)calloc(5, sizeof(int));
	int i = 0;

	if (p == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
        //越界访问
		for (i = 0; i <= 5; i++)
		{
			*(p + i) = i + 1;
		}

		free(p);
		p = NULL;

	}
}

3、对非动态开辟空间内存使用free

void test()
{
	int a = 0;
	int* p = &a;

	free(p);
	p = NULL;

}

p不是动态开辟的内存空间,不能用 free 释放,❌

4、使用free释放一块 开辟空间的一部分

void text()
{
	int* p = (int*)malloc(10 * sizeof(int));
    
    //先判断是不是空指针,再使用
    // if(p=NULL)…………

	for (int i = 0; i <= 5; i++)
	{
		*p = i;
		p++;
	}
	//❌因为p的地址已经改变,不是开辟空间的首地址
	free(p);
	p = NULL;

}

尽量不要改变开辟空间的首地址,以下使用是比较好的

标签:10,malloc,管理,int,释放,free,动态内存,NULL
From: https://blog.csdn.net/weixin_65994469/article/details/144381570

相关文章

  • F5的WAF产品具有丰富的功能:攻击防护功能、智能检测与分析功能、安全管理与配置功能、A
    攻击防护功能防范常见Web攻击:能有效检测和阻止如SQL注入、跨站脚本攻击(XSS)、文件上传漏洞、命令注入等各类常见的Web应用攻击。通过对HTTP/HTTPS请求的深度分析,包括请求头、请求体、URL参数等,与预定义的攻击签名和规则进行精准匹配,及时发现并阻断恶意请求。抵御应用层DDoS攻击:......
  • SSM高校社团学生会管理系统--47676(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP
    摘  要本论文基于SSM框架,设计和实现了一个高校社团学生会管理系统。该系统旨在提供一个全面、高效、智能的高校社团学生会管理平台,以便管理者可以迅速且便捷地进行各项管理工作,并及时向社团成员提供准确的社团信息。  该系统通过角色划分为社团成员、社团社长和管理员......
  • 跨境电商管理新风潮:用看板工具实现全链条优化
    一、跨境电商的管理难题在跨境电商的运营过程中,企业面临着许多管理难题。不同地区的市场需求差异,国际化的供应链管理,跨语言和跨文化的沟通问题,都需要精细化管理和高效的协作。具体来说,跨境电商管理中常见的挑战包括:多渠道、多平台管理:跨境电商往往涉及多个销售平台,如亚马逊、eB......
  • 网站关键词在哪里修改,如何在网站后台管理系统中修改关键词
    网站关键词是搜索引擎优化(SEO)的重要组成部分,合理设置关键词可以提高网站的搜索排名。如果您需要在网站后台管理系统中修改关键词,以下是详细步骤:登录后台管理系统:使用管理员账号登录网站的后台管理系统。导航到SEO设置或元数据管理界面。进入SEO设置:在后台管理界面中,找......
  • HR靠自己搭的人力资源管理系统升职总监了
    人力资源管理系统如果难用,真不是技术实现不了,纯粹是预算不到位,或是设计之初没有充分考虑用户体验。系统做出来了,但实际好不好用,似乎没人真正关心。市面上的系统普遍存在三个问题:1.业务流程太复杂:有些企业不懂得如何简化流程,非要搞一堆冗余的步骤,美其名曰“精细化管理”。结果......
  • springboot毕设三只粽子猫舍信息管理系统程序+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着人们生活水平的提高,宠物猫在家庭中的地位日益凸显,猫舍的规模和业务量也不断增长。目前,众多猫舍在管理上仍依赖传统的人工方式,例如对于猫舍员......
  • 15种项目经理常用的项目管理工具和技术
    甘特图(GanttChart)定义与用途:甘特图是一种以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间。它可以直观地展示项目进度,帮助项目经理明确任务的开始时间、结束时间和持续时长,以及不同任务之间的先后顺序和并行关系。应用场景:适用于项目计划......
  • 项目管理文档目录结构包含哪些内容
    一、项目启动与规划(一)项目章程项目背景与目标项目范围概述项目团队组织结构与职责项目主要里程碑与交付成果项目预算与资源估算项目风险初步识别与应对策略项目发起人与相关利益者签字(二)项目范围说明书详细的项目范围界定,包括项目包含与不包含的工作内容项目可交付......
  • 跨域文件管控新方案,让数据管理变得简单而高效!
    随着经济的快速发展,越来越多的企业规模不断扩大,并在异国、异地设立分支机构。这些分支机构与企业总部之间需要进行频繁的文件传输和数据交换,以支持企业的日常运营和决策。由于分支机构可能位于不同的地理位置、拥有不同的网络环境和组织架构,因此跨域文件管控传输成为了一种必然的......
  • Containerd容器管理工具(轻量级、工业容器管理工具)
    一、Containerd介绍前言早在2016年3月,Docker1.11的DockerEngine里就包含了containerd,而现在则是把containerd从DockerEngine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在DockerEngine里containerd相比......