C之动态内存管理(动态内存开辟与调整等)

目录

1.为什么要有动态内存分配

2.malloc、calloc、realloc和free

malloc:

calloc:

realloc:

free:

3.常见的动态内存的错误

3.1:对NULL指针的解引用操作

3.2:对动态开辟空间的越界访问

3.3:对非动态开辟的内存使用free函数释放

3.4:使用free释放一块动态开辟内存的一部分

3.5:对同一块动态内存多次释放

3.6:动态开辟内存忘记释放(内存泄漏)

4.柔性数组

柔性数组的特点

柔性数组的优势

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


我们已经掌握的内存开辟方式有:

int a = 20; ——在栈空间上开辟四个字节

char arr[100] = {0}; ——在栈空间上开辟100个字节的连续空间

其他如“double x = 1.0”、“int arr[50] = {0}”等内存开辟方式本质上跟上面两种是相同的。

那么我们既然已经有了上述两种开辟内存的方式,为什么还要开辟动态内存呢?

这就引出了我们的下文:

1.为什么要有动态内存分配

上文中我们已经讲过了我们已经掌握的两种内存开辟方式,它们有两个特点:

  • 空间开辟大小是固定的
  • 数组在申明时必须指定数组长度,数组大小一旦确定了就不能调整

但是上面往往不能满足我们对于空间的需求,有时候我们需要申请的空间大小往往在运行时才能知道,那数组在编译时开辟空间的方式就无法满足我们的需求了。

因此C语言引入了动态内存开辟,让我们可以自己申请开辟、调整和释放空间。

2.malloc、calloc、realloc和free

:以下四个函数都需要包含头文件<stdlib.h>.

malloc:

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

函数原型如下(malloc - C++ Reference (cplusplus.com)):

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

如图:

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

calloc:

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

函数原型如下(calloc - C++ Reference (cplusplus.com)):

  • 函数的作用是为num个大小为size的元素开辟一块空间,并把空间的每个字节都初始化为0
  • 与函数malloc的区别只在于calloc在返回地址之前会把每个字节都初始化为0

因此,我们可以将calloc当作malloc使用,特别是在申请的空间要求初始化时最好用calloc。

realloc:

realloc函数就是用来对动态开辟内存的大小进行调整的

函数原型如下(realloc - C++ Reference (cplusplus.com)):

  • ptr 是要调整的内存地址(即动态开辟内存后返回的地址)
  • size为调整之后的新大小(单位为字节)
  • 返回值为调整之后的内存起始位置
当我们开辟空间后,我们如果需要调整动态内存的大小,那么我们此时可以使用realloc。
当我们要让动态内存变小时,直接在原空间的基础上减小其占用的空间即可;
但是当动态内存要增大扩张时呢?——此时分为两种情况:
  1. 原有空间之后有⾜够⼤的空间
  2. 原有空间之后没有⾜够⼤的空间

如图:

free:

free函数就是用来对“动态内存”进行释放和回收的。

函数原型如下(free - C++ Reference (cplusplus.com)):

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

注意:free是对“动态”内存进行释放的,而且释放后我们需要将释放的指针置NULL以规避野指针。

3.常见的动态内存的错误

3.1:对NULL指针的解引用操作

如图:

3.2:对动态开辟空间的越界访问

如图:

当运行时程序会报错。

3.3:对非动态开辟的内存使用free函数释放

如图:

此时p指针的空间为固定的,并非动态开辟出的空间,因此不能用free释放,运行时程序会报错。

3.4:使用free释放一块动态开辟内存的一部分

如图:

一如既往的报错。

3.5:对同一块动态内存多次释放

3.6:动态开辟内存忘记释放(内存泄漏)

4.柔性数组

柔性数组概念比较小众,但它确实存在。

C99中,结构中的最后一个元素允许是未知大小的数组,这就叫柔性数组成员。

如图:

有些编译器不支持a[0]的写法,那么我们改成a[]也是可以的,如图:

柔性数组的特点
  • 结构中的柔性数组成员前⾯必须⾄少有⼀个其他成员。
  • sizeof 返回的这种结构大小不包括柔性数组的内存
  • 包含柔性数组成员的结构用malloc ()函数进⾏内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
例如:
柔性数组的优势

如图:

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

C/C++程序内存分配的⼏个区域:
  1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。 栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  3. 数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体(类成员函数和全局函数)的⼆进制代码。


创作不易,如果觉得作者写的勉强能入眼的话给个免费的三连吧亲😙

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

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

相关文章

长城电脑如何恢复删除文件?盘点几个实用方法

咨询&#xff1a;急求帮助&#xff01;我不慎在长城电脑上删除了文件&#xff0c;还有机会恢复吗&#xff1f;一个疏忽&#xff0c;就把一份至关重要的工作文件给删掉了&#xff01;请大家快快伸出援手&#xff0c;帮我找回这份文件吧&#xff01; 在使用长城电脑的过程中&…

Linux_应用篇(11) 线程

上一章&#xff0c;学习了进程相关的知识内容&#xff0c; 对进程有了一个比较全面的认识和理解&#xff1b; 本章开始&#xff0c; 将学习 Linux应用编程中非常重要的编程技巧---线程&#xff08;Thread&#xff09; &#xff1b;与进程类似&#xff0c;线程是允许应用程序并发…

GaussDB数据库如何创建修改数据库和数据表

目录 一、背景 二、创建数据库和数据表 1. 创建数据库 2.创建数据表 三、修改表结构 1. 添加列 2. 修改列 3. 删除列 四、添加约束 1. 添加主键约束 2. 添加外键约束 3.添加唯一性约束 五、示例代码 -- 创建数据库 -- 使用新创建的数据库 -- 创建 department 表…

发送Http请求的两种方式

说明&#xff1a;在项目中&#xff0c;我们有时会需要调用第三方接口&#xff0c;获取调用结果&#xff0c;来实现自己的业务逻辑。调用第三方接口&#xff0c;通常是双方确定好&#xff0c;由对方开放一个接口&#xff0c;需要我们根据他们提供的接口文档&#xff0c;组装Http…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时&#xff0c;Python作为一种强大的编程语言&#xff0c;也提供了多种与MySQL交互的库&#…

Ubuntu 24.04 LTS 安装Docker

1 更新软件包索引&#xff1a; sudo apt-get update 2 安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库&#xff1a; sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥&#xff1a; curl -fs…

算法金 | 你真的完全理解 Logistic 回归算法了吗

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 今日 178/10000 1. 引言 吴恩达&#xff1a;机器学习的六个核心算法&#xff01;&#xff0c; 通透&#xff01;&#xff01;十大回…

Python专为开发和部署数据驱动的应用程序库之taipy使用详解

概要 Taipy 是一个强大的 Python 库,专为开发和部署数据驱动的应用程序而设计。它通过提供一套丰富的工具和组件,使开发者能够快速构建和维护复杂的业务逻辑和数据交互界面。无论是金融分析、供应链管理还是任何需要高度数据交互的应用,taipy 都能提供高效的解决方案。 安装…

Orange AIpro开箱上手

0.介绍 首先感谢官方给到机会&#xff0c;有幸参加这次活动。 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/2…

小程序抓包详细教程

小程序抓包详细教程 前言&#xff1a;关于小程序抓包一直想写出一个比较详细的教程 实验设备&#xff1a; ​ 微信: https://windows.weixin.qq.com/?langzh_CN ​ Proxifier&#xff1a;https://www.proxifier.com/download/ (需要挂梯子访问下载) ​ burpsuite&#xff…

1.JAVA小项目(零钱通)

一、说明 博客内容&#xff1a;B站韩顺平老师的视频&#xff0c;以及代码的整理。此项目分为两个版本&#xff1a; 面向过程思路实现面向对象思路实现 韩老师视频地址&#xff1a;【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh4…

Spring 源码:深度解析AOP源码配置解析

文章目录 一、 解析AOP配置的入口1.1 从XML配置到AOP Namespace的解析流程1.2 分析注解驱动的AOP配置解析流程 二、AOP配置解析的核心流程2.1 ConfigBeanDefinitionParser 类2.2 parse()2.3 parseAdvisor()2.4 parseAspect()2.5 parsePointcut()2.6 createAdvisorBeanDefinitio…

算法每日一题(python,2024.05.29) day.11

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 法一&#xff1a;切片函数法 直接用python中的切片函数直接解决 法二&#xff1a;交换法 从俩头开始交换字符串的数字&#xff0c;若为奇数&#xff…

GITLAB常见问题总结

Troubleshooting GitLab Pages administration (FREE SELF) 原文地址 stage: Plan group: Knowledge info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/…

STM8单片机变频器设计

变频调速技术是现代电力传动技术的重要发展方向,而作为变频调速系统的核心—变频器的性能也越来越成为调速性能优劣的决定因素,除了变频器本身制造工艺的“先天”条件外,对变频器采用什么样的控制方式也是非常重要的。随着电力电子技术、微电子技术、计算机网络等高新技术的…

Kompas AI:智能生活的开启者

引言 在现代社会&#xff0c;**人工智能&#xff08;AI&#xff09;**已经深刻地影响了我们的生活和工作。无论是智能家居、自动驾驶&#xff0c;还是医疗诊断&#xff0c;AI的应用无处不在。而在众多AI平台中&#xff0c;Kompas AI 作为一个先进的对话式AI平台&#xff0c;通过…

R语言数据分析-针对芬兰污染指数的分析与考察

1. 研究背景及意义 近年来&#xff0c;随着我国科技和经济高速发展&#xff0c;人们生活质量也随之显著提高。但是&#xff0c; 环境污染问题也日趋严重&#xff0c;给人们的生活质量和社会生产的各个方面都造成了许多不 利的影响。空气污染作为环境污染主要方面&#xff0c;更…

【漏洞复现】海康威视综合安防管理平台 orgManage/v1/orgs/download 任意文件读取漏洞

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

7-8 矩阵字符

给定一个仅包含小写字母的字符串S,用这些字符恰好排成一个n行m列的矩阵(m≥n)&#xff0c;请找出所有符合要求的矩阵中最接近于正方形的那个矩阵。然后从第一列开始&#xff0c;逐列按照从上到下的顺序输出矩阵中的字符。 例如&#xff1a;S "abcdefgh"。按要求m≥…

动态规划-求买卖股票所能获得的最大收益(hard)

一、问题描述 二、解题思路 1.先看有哪几个可变参数&#xff1a; (1).当前第几天 nowday(范围&#xff1a;0->n-1) (2).剩余交易次数 restTime(范围&#xff1a;k->0) (3).当天可买入还是可卖出 isnowHold(0 表示当前未持有可买入&#xff0c;1 表示当前持有可卖出) 2.…