深入挖掘C语言 ----动态内存分配

news2025/1/18 14:46:01

开篇备忘录: "自给自足的光, 永远都不会暗"

目录

  • 1. malloc和free
    • 1.1 malloc
    • 1.2 free
  • 2. calloc和realloc
    • 2.1 calloc
    • 2.2 realloc
  • 3. 总结C/C++中程序内存区域划分


正文开始

1. malloc和free

1.1 malloc

C语言提供了一个动态开辟内存的函数;

void* malloc (size_t size);

这个函数向内存申请一块连续可用的空间, 并返回指向这块空间的指针.

  • 如果内存开辟成功, 则返回一个指向开辟好空间的指针
  • 如果开辟失败, 则返回一个NULL指针, 因此malloc的返回值一定要做检查
  • 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型, 具体在使用的时候使用者自己来决定
  • 如果参数size为0, malloc的行为标准是未定义的, 取决于编译器

1.2 free

C语言提供了另外一个函数free, 专门是用来做动态内存释放和回收的, 函数原型如下:

void free (void* ptr);

free函数用来释放动态开辟的内存.

  • 如果参数ptr指向的空间不是动态开辟的, 那free函数的行为是未定义的.
  • 如果参数ptr指向的是NULL指针, 则函数什么事都不用做.

malloc 和 free 都声明在stdlib.h 头文件中

int main()
{
	int* ptr = NULL;
	ptr = (int*)malloc(sizeof(int) * 10);
	if (ptr != NULL)
	{
		for (int i = 0; i < 10; i++)
		{
			*(ptr + 1) = 0;
		}
	}
	free(ptr);
	ptr = NULL;
	return 0;
}

2. calloc和realloc

2.1 calloc

C语言还提供了一个函数叫做calloc, calloc函数也用来动态内存分配, 原型如下:

void* calloc (size_t num, size_t size);
  • 函数的功能是为num个大小为size的元素开辟一块空间, 并且把空间的每个字节都初始化为0
  • 与函数malloc的区别在于calloc会返回地址之前把申请的空间的每个字节初始化为0
int main()
{
	int* p = calloc(10, sizeof(int));
	if (p != NULL)
	{
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", *(p + i));
		}
	}
	free(p);
	p = NULL;
	return 0;
}

运行程序:
在这里插入图片描述

所以如果我们对申请的内存空间的内容要求初始化, 那么可以很方便的使用calloch函数来完成任务.

2.2 realloc

  • realloc函数的出现让动态内存管理更加灵活
  • 有时候我们发现过去申请的空间太小了, 有时候我们又会觉得申请的空间过大了, 那为了合理的使用内存, 我们一定会对内存的大小做灵活调整. 那realloc函数就可以做到对动态开辟内存大小的调整

函数原型如下:

void* realloc (void* ptr, size_t size);
  • ptr 是要调整的内存地址
  • size 调整之后新的大小
  • 返回值为调整之后的内存起始位置
  • 这个函数原内存空间大小的基础上, 还会将内存中的数据移动到新的空间
  • realloc 在调整内存空间的时候存在两种情况:
    1. 原有的空间之后有足够大的空间
    1. 原有的空间之后没有足够大的空间

两种情况如下图所示:

在这里插入图片描述

情况1:

要扩展内存就直接原有内存之后直接追加空间, 原来空间的数据不发生变化

情况2:

原有的空间之后没有足够多的空间, 扩展的方法是: 在堆空间上寻找另外一个1合适大小的连续空间来使用, 这样函数返回的就是一个新的内存的地址

由于上述两种情况, realloc函数的使用就要注意一些:

int main()
{
	int* ptr = (int*)malloc(100);
	if (ptr != NULL)
	{
		//业务处理
	}
	else 
	{
		return 1;
	}

	//扩充容量

	//代码1 - 直接将realloc的返回值放到ptr中
	ptr = (int*)realloc(ptr, 100);//(可以吗? , 如果开辟内存失败又会如何?)

	//代码2 - 先将realloc函数的返回值放在p中, 不为NULL,再放在ptr中

	int* p = NULL;
	p = realloc(ptr, 1000);
	if (p != NULL)
	{
		ptr = p;
	}
	//业务处理

	free(ptr);
	free(p);
	ptr = NULL;
	p = NULL;
	return 0;
}

3. 总结C/C++中程序内存区域划分

在这里插入图片描述

C/C++ 程序内存分配的几个区域:

1.栈区(stack): 在执行函数的时候, 函数内局部变量的存储单元都可以在栈上创建,
函数执行结束时这些存储单元自动被释放, 栈内存分配运算内置于处理器的指令集中, 
效率很高, 但是分配的内存容量有限, 栈区主要存放运行函数时而分配的局部变量, 
函数参数, 返回数据, 返回地址等. 这里推荐一本书<<函数栈帧的创建和销毁>>

2.堆区(heap): 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由
OS(操作系统)回收,分配方式类似于链表

3.数据段(静态区): (static) 存放全局变量, 静态数据, 程序结束后由操作系统释放.

4. 代码段: 存放函数体(类成员函数和全局函数)的二进制代码. 

本文内容到此结束, 还望读者点赞关注.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1608336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的迭代器:深入理解与实用指南

文章目录 1. 迭代器的基本概念2. Python中的迭代器实例3. 自定义迭代器3.1 例子3.2 详细过程 4. 迭代器的高级应用5. 常见问题与解答 迭代器是Python中非常核心的概念之一&#xff0c;在面试中也会被问到。下面我会详细介绍什么是迭代器&#xff0c;使用方法&#xff0c;以及使…

爬虫 | 基于 requests 实现加密 POST 请求发送与身份验证

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在实现一个简单的 Python 脚本&#xff0c;用于向指定的 URL 发送 POST 请求&#xff0c;并通过特定的加密算法生成请求头中的签名信息。这个脚本的背后是与某个特定的网络服务交互&#xff0c;发送特定格式的 JSON 数据…

vi编辑器的用法linux中的vim编辑器大全

vim的介绍 vi 和 vim 命令是linux中强⼤的⽂本编辑器, 由于Linux系统⼀切皆⽂件&#xff0c;⽽配置⼀个服务就是在修改其配置⽂件的参数。 vim 编辑器是运维⼯程师必须掌握的⼀个⼯具, 没有它很多⼯作都⽆法完成。 其中有vi和vim两种 vi和vim的区别 Vim是Vi的升级版本&#…

source map 开发优化工具

什么是 Source map 简单来说 Source map 就是一个存储信息的文件&#xff0c;里面储存着位置信息。 Source map 英文释义&#xff1a;源程序映射。 位置信息&#xff1a;转换后的代码 对应的 转换前的代码 位置映射关系。 有了 Source map&#xff0c;就算线上运行的是转换…

el-menu 该有的页面显示不出来第一个应该想到的问题首先就算检查是否多写了一个 , 导致显示不出来原有的页面

问题描述 el-menu 该有的页面显示不出来第一个应该想到的问题首先就算检查是否多写了一个 , 导致显示不出来原有的页面 如图所示多写了一个&#xff0c;就会导致该有的页面显示不出来。

nVisual在线网络规划设计软件

●01● nVisual在线网络规划设计软件 在信息化快速发展的今天&#xff0c;网络基础设施的建设与优化变得尤为关键。为了满足现代通信行业对高效、精准的网络规划需求&#xff0c;nVisual在线网络规划设计软件应运而生&#xff0c;它通过集成先进的GIS技术和网络规划工具&#…

OpenHarmony鸿蒙南向开发案例:【智能门铃】

样例简介 智能门铃通过监控来访者信息&#xff0c;告诉主人门外是否有人按铃、有陌生人靠近或者无人状态。主人可以在数字管家中远程接收消息&#xff0c;并根据需要进行远程取消报警和一键开锁。同时&#xff0c;也可以通过室内屏幕获取门外状态。室内屏幕显示界面使用DevEco…

人工智能,如何走好下一步

以下文章来源&#xff1a;金台资讯 2023年&#xff0c;生成式人工智能在全球范围爆火&#xff0c;引发了人工智能领域新一轮的科技竞赛。眼下&#xff0c;人工智能不仅能辅助科学研究与艺术创作&#xff0c;还能实现自动驾驶、打造“无人农场”和“黑灯工厂”&#xff0c;成为解…

数据很重要,ASM磁盘组损坏,使用AMDU来抢救

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享“数据很重要&#xff0c;ASM磁盘组损坏&#xff0c;使用AMDU来抢救”的处置案例。这个案例对个人来说比较经典&#xff0c;下面我将把自己的处理思路进行整理与总结。 环境信息&#xff1…

户用光伏业务解决方案

一、光伏户用痛点 1、推广难 没有成熟的推广与拓客能力&#xff0c;造成时间和金钱大量浪费。 2、管理难 有内部和外部几十或者上百推广人员&#xff0c;管理纷杂&#xff0c;效率低下。 3、无制度 缺少有效的人员管理制度与系统&#xff0c;分辨不出优秀人才&#xff0c…

Let‘s Forkin‘ Dance!Tanssi 激励测试网活动全面启动

作者&#xff1a;Tanssi 编译&#xff1a;OneBlock 作为 Tanssi 社区和生态系统发展的重要推手&#xff0c;Tanssi 基金会推出了 Incentivized TestNet 活动 —— Let’s Forkin’ Dance。该活动旨在激励顶尖参与者&#xff0c;推动社区增长和网络活动&#xff0c;为今年晚些时…

c语言-快速排序

文章目录 代码工程运行结果 这个是升序排列&#xff0c;如果想降序排列,将下面两行的符号反过来即可; arr[right] < arr[key] arr[left] > arr[key]代码工程 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>void swap(int *v1, int *v2) {int temp *v1;*v1 …

【VTKExamples::Meshes】第 十四期 ExtractEdges

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractEdges,并解析接口vtkExtractEdges,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~…

如何高效建立企业绩效评估体系?这家世界500强企业用BI工具这么做

在目前经济下行&#xff0c;竞争激烈&#xff0c;向精细化管理要效益的社会背景下&#xff0c;如何对资金结算部门做好绩效管理&#xff0c;以保障组织的正常运作&#xff0c;是各大企业面对的重要痛点。 本文将基于某世界500强公司的财务共享资金结算部门的绩效管理办法&…

python处理IP对应城市省份

python处理IP对应城市省份 IP地理地址库geoip2用法 数据包下载 数据包下载地址&#xff08;需要注册&#xff09; https://www.maxmind.com/en/accounts/258630/geoip/downloads 考虑到注册麻烦&#xff0c;可以到下面这个github的链接去直接下载 https://github.com/Hackl0…

代码随想录第41天| 96.不同的二叉搜索树 动态规划:01背包理论基础

96.不同的二叉搜索树 96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划找到子状态之间的关系很重要&#xff01;| LeetCode&#xff1a;96.不同的二叉搜索树_哔哩哔哩_bilibili 给你一个整数 n &#xff0c;求恰由 n 个…

【随笔】Git 基础篇 -- 拉取数据 git pull(二十八)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

STM32电机控制固件架构

目录 一、应用程序剖析 二、面向现场的控制实现体系结构 1、参考计算循环 2、电流调节环路 3、安全回路 一、应用程序剖析 上图显示了由ST MC SDK构建的电机控制应用程序。首先&#xff0c;这样的应用程序是由电机控制工作台生成的软件项目&#xff0c;这要归功于STM32Cube…

程序员副业指导

程序员如何搞副业&#xff1f; 程序员不仅拥有将抽象概念转化为实际应用的能力&#xff0c;还通常具备强大的逻辑思维和问题解决能力。然而&#xff0c;许多程序员并不满足于仅仅在一家公司工作&#xff0c;他们渴望通过副业来实现个人价值的最大化&#xff0c;增加收入&#…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁&#xff1f; A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点&#xff1a;网络安全 解析&#xff1a;&#xff08;B&#xff09; 钓鱼攻击通常被认为是应用层的安全威胁&#xff0c;也有在网络层进行伪装实施钓鱼攻击&#xff0c;…