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

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

目录

  • 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.mzph.cn/news/825909.shtml

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

相关文章

python处理IP对应城市省份

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

2024-9.python文件操作

文件操作 引言 到目前为止&#xff0c;我们做的一切操作&#xff0c;都是在内存里进行的&#xff0c;这样会有什么问题吗&#xff1f;如果一旦断电或发生意外关机了&#xff0c;那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢&#xff1f;现在你是否感觉你的编程技…

【Java EE】依赖注入DI详解

文章目录 &#x1f334;什么是依赖注入&#x1f340;依赖注入的三种方法&#x1f338;属性注入(Field Injection)&#x1f338;构造方法注入&#x1f338;Setter注入&#x1f338;三种注入优缺点分析 &#x1f333;Autowired存在的问题&#x1f332;解决Autowired对应多个对象问…

动态库静态库linux

动态库静态库 静态库 静态库必须包含在可执行文件里&#xff0c;整个都要包含 缺点&#xff1a;消耗系统大&#xff0c;每个使用静态库的程序都要复制静态库&#xff08;浪费内存&#xff09; 影响使用场景&#xff1a; 在静态库内存小的时候&#xff0c;可以用来提升速度 制…

Scala 03 —— Scala Puzzle 拓展

Scala 03 —— Scala Puzzle 拓展 文章目录 Scala 03 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

【C++】<入门>C++入门基础知识

C入门 1. 入门0. 本节知识点熟悉目的1. C关键字&#xff08;C98&#xff09; 2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰&#xff08;name Ma…

Vue3从入门到实践:深度了解新组件

1.Teleport 概念&#xff1a;Teleport&#xff08;传送门&#xff09;是一个新的特性&#xff0c;用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置&#xff0c;而不受组件层次结构的限制。 下面举出例子解释&#xff1a; 1.新建App.vue文件作…

RACE IPEMD:构建安全基石的密码学原理与实践

title: RACE IPEMD&#xff1a;构建安全基石的密码学原理与实践 date: 2024/4/16 16:53:56 updated: 2024/4/16 16:53:56 tags: IPEMD哈希算法SHA-1SHA-2/3消息摘要数字签名安全分析 前言 在当今信息爆炸的时代&#xff0c;数据安全和隐私保护变得尤为重要。密码学作为信息安…

计算机视觉——基于OpenCV和Python进行模板匹配

模板匹配&#xff1f; 模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛&#xff0c;包括但不限于图像识别、目标跟踪和场景理解等。 目标和原理 模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的…

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接&#xff1a;1584. 连接所有点的最小费用 - 力扣&#xff08;LeetCode&#xff09; 主要思路&#xff1a;使用krusal算法&#xff0c;将边的权值进行排序&#xff08;从小到大排序&#xff09;&#xff0c;每次将权值最小且未加入到连通分量中…

Cesium中实现镜头光晕

镜头光晕 镜头光晕 (Lens Flares) 是模拟相机镜头内的折射光线的效果&#xff0c;主要作用就是让太阳光/其他光源更加真实&#xff0c;和为您的场景多增添一些气氛。 Cesium 中实现 其实 Cesium 里面也是有实现一个镜头光晕效果的&#xff0c;添加方式如下&#xff0c;只是效…

Python教学入门:数字类型与字符串

字符串元素组成的序列 字符串元素组成的序列指的是字符串中的每个字符按照一定的顺序排列形成的序列。在 Python 中&#xff0c;字符串是由字符组成的有序序列&#xff08;Sequence&#xff09;&#xff0c;每个字符在字符串中有其固定的位置&#xff08;索引&#xff09;&…

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器&#xff0c;该方法的源码如下&#xff1a; /*** Set the {link LayoutManager} that this RecyclerV…

java网络编程 BufferedReader的readLine方法读不到数据且一直阻塞

最近在整理Java IO相关内容&#xff0c;会遇到一些以前没有注意的问题&#xff0c;特此记录&#xff0c;以供自查和交流。 需求&#xff1a; 基于Java的BIO API&#xff0c;实现简单的客户端和服务端通信模型&#xff0c;客户端使用BufferedReader的readLine方法读取System.i…

ASPICE 追溯性实践分享

01前言 接着之前的分享&#xff0c;遗留的追溯性ASPICE 认证实践及个人理解分享-CSDN博客文章浏览阅读961次&#xff0c;点赞22次&#xff0c;收藏17次。ASPICE是Automotive 和SPICE的组合&#xff0c;全英文为&#xff08;Automotive Software ProcessImprovement and Determ…

C++修炼之路之继承<二>

目录 一&#xff1a;子类的六大默认成员函数 二&#xff1a;继承与友元 三&#xff1a;继承与静态成员 四&#xff1a;复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承&#xff1b;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

小程序 前端如何用wx.request获取 access_token接口调用凭据

在微信小程序中,获取access_token通常是通过wx.request方法来实现的。以下是一个简单的示例代码: 1.获取小程序的appID 与 secret(小程序密钥) 登录之后,请点击左侧的"开发管理"==>点击"开发设置" 就可以找到 2. 在javascript 中的代码: // 定…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…

算法刷题记录2

4.图 4.1.被围绕的区域 思路&#xff1a;图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归&#xff0c;找与边界O联通的O&#xff0c;并标记为#&#xff08;代表已遍历&#xff09;&#xff0c;最后图中剩下的O就是&#xff1a;被X包围的O。图中所有…

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言 对于一些单片机类的环境检测或者智能家居小项目中&#xff0c;温湿度传感器&#xff08;DHT11&#xff09;以及光照强度传感器&#xff08;BH1750&#xff09;往往是必不可少的两个外设&#xff0c;下面我们来剖析这两个外设的原理&#xff0c;以及使用。 1. 温湿度传感…