当前位置: 首页 > news >正文

【C语言】动态内存管理(上)

文章目录

  • 前言
  • 1.为什么要存在动态内存
  • 2. malloc和free
    • 2.1 malloc
    • 2.2 free
    • 2.3 使用实例(malloc和free)
  • 3. calloc
    • 3.1 calloc例子

前言

本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要,为了方便描述,本次知识点分为上下两个章节。本次先跟大家聊一聊上半个章节的知识点——malloc和calloc函数

1.为什么要存在动态内存

目前我们掌握的内存开辟的方式就两种:

int val = 20;//在栈空间上开辟4个字节
char arr[66] = {0};//在栈空间上开辟一个大小为66个字节的连续内存空间

但是仔细思考一下,你会发现上述内存开辟有两个特点:

  • 开辟内存空间的大小是固定不变的
  • 数组在声明的时候,必须指明数组长度,数组的大小一旦确认下来之后就不可以改变了

但是我们对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟的内存空间的方式就不能满足我们的需求了。

为此C语言引入了动态内存开辟,让程序员可以自己申请和释放空间,比较灵活和方便。

2. malloc和free

2.1 malloc

malloc函数是C语言提供的一种动态内存开辟的函数之一,其被包含在stdlib.h的头文件中。
具体细节如下:
malloc
malloc
这个函数就是向内存申请一块连续可用的空间,并且返回这块空间的起始地址。

总结就是:

  • 形参:填入需要创建多大内存空间的数量,单位是字节。
  • 如果参数size为0,malloc行为是标准未定义的,具体去取决于编译器的实现。
  • 返回值:如果开辟成功,则返回一个指向开辟好空间的指针;如果开辟失败,则返回一个NULL指针,因此malloc函数在使用时一定要注意器返回值的判定。
  • 返回值类型:void*,所以一般在使用malloc函数一定要进行强制类型转换,具体情况按照实际需求来决定。

2.2 free

C语言提供的另外一个用作动态内存开辟重要的函数——free,free函数是专门用来做动态内存的释放和回收的。
函数具体细节如下:
free
free函数是用来释放所申请动态开辟的空间。

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

注意:malloc和free函数都声明在stdlib.h的头文件中。

2.3 使用实例(malloc和free)

#include<stdio.h>
#include<stdlib.h>//malloc的作用
int main()
{int* p = (int*)malloc(10*sizeof(int));//动态申请10个整型大小的空间,并且malloc函数的返回值做了强制类型转换为int*,原因是我要操作的是整型的数据if (p == NULL){perror("malloc failed");return 1;}for (int i = 0; i < 11; i++){*(p + i) = i + 1;}for (int i = 0; i < 10; i++){printf("%d ",p[i]); }free(p);p = NULL;//这步很重要,因为我虽然释放了它们的空间,但是指针p里面的值确实没有被消除的。//也就是说,p仍然还记得那个申请动态空间的起始地址,但是那个空间已经被回收了不属于我们的了,指针p就成为了也野指针。//为此,就要将p置为NULLreturn 0;
}

3. calloc

C语言还提供了一个动态开辟内存的函数——calloc
具体细节如下:
calloc

总结:

  • 函数的功能是为num个大小为size的元素开辟一个连续的内存空间,并且把空间中的每个字节都初始化为0。
  • 与函数malloc功能相似,区别只在于calloc函数会在返回地址之前把申请空间的每个字节全初始化为0。

3.1 calloc例子

int main()
{int* p = (int*)calloc(10,sizeof(int));//如果申请失败if (p == NULL){perror("calloc failed");return 1;}for (int i = 0; i < 10; i++){printf("%d ",p[i]);}free(p);p = NULL;return 0;
}

结果展示
正如结果所示,calloc函数的作用是申请一块num个大小为size的连续的内存空间,并且讲动态开辟的内存空间每个字节都初始化为0了。

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

相关文章:

【C语言】动态内存管理(上)

文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例&#xff08;malloc和free&#xff09; 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要&#xff0c;为…...

【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘

已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…...

网络安全-网络安全及其防护措施11

51.网络容量规划 网络容量规划的概念和重要性 网络容量规划&#xff1a; 是指根据业务需求和预期增长&#xff0c;合理规划和设计网络的带宽、设备和资源&#xff0c;以满足未来网络流量和服务质量的需求。通过有效的网络容量规划&#xff0c;确保网络性能稳定和用户体验良好…...

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式&#xff1a;我们的目标是使用IDEA编写lua脚本&#xff0c;所以不需要勾选。后面需要的话&#xff0c;可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…...

CentOS 7 安装MySQL 5.7.30

CentOS 7 安装MySQL卸载&#xff08;离线安装&#xff09; 安装配置MySQL之前先查询是否存在&#xff0c;如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除&#xff08;删除…...

Bash 学习摘录

文章目录 1、变量和参数的介绍&#xff08;1&#xff09;变量替换$(...) &#xff08;2&#xff09;特殊的变量类型export位置参数shift 2、引用&#xff08;1&#xff09;引用变量&#xff08;2&#xff09;转义 3、条件判断&#xff08;1&#xff09;条件测试结构&#xff08…...

GD32 MCU是如何进入中断函数的

用过GD32 MCU的小伙伴们都知道&#xff0c;程序是顺序执行的&#xff0c;但当有中断来的时候程序会跳转到中断函数&#xff0c;执行完中断函数后程序又继续回到原来的位置继续执行&#xff0c;那么你们知道MCU是如何找到中断函数入口的吗&#xff1f; 今天我们就以GD32F303系列…...

Ruby 循环

Ruby 循环 在编程中&#xff0c;循环是一种常用的控制结构&#xff0c;它允许我们重复执行一段代码多次。Ruby 作为一种灵活的编程语言&#xff0c;提供了多种循环方法&#xff0c;包括 while、until、for、each 和 loop 等。本文将详细介绍 Ruby 中的循环机制&#xff0c;并通…...

三字棋游戏(C语言详细解释)

hello&#xff0c;小伙伴们大家好&#xff0c;算是失踪人口回归了哈&#xff0c;主要原因是期末考试完学校组织实训&#xff0c;做了俄罗斯方块&#xff0c;后续也会更新&#xff0c;不过今天先从简单的三字棋说起 话不多说&#xff0c;开始今天的内容 一、大体思路 我们都知…...

H3CNE(计算机网络的概述)

1. 计算机网络的概述 1.1 计算机网络的三大基本功能 1. 资源共享 2. 分布式处理与负载均衡 3. 综合信息服务 1.2 计算机网络的三大基本类型 1.3 网络拓扑 定义&#xff1a; 网络设备连接排列的方式 网络拓扑的类型&#xff1a; 总线型拓扑&#xff1a; 所有的设备共享一…...

【极客日常】Golang一个的slice数据替换的bug排查

上周某天下班前&#xff0c;接到同事转来一个bug要排查&#xff0c;症状是代码重构之后某些业务效果不符合预期&#xff0c;由于代码重构人是笔者&#xff0c;于是blame到笔者这边。经过10min左右的排查和尝试后&#xff0c;解决了这个问题&#xff1a;既往逻辑没有改动&#x…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…...

【2024德国签证】留学面签问题汇总

在去交材料的时候&#xff0c;可能会被随机安排面试。这些面试问题一般都很简单&#xff0c;主要是测试你的基本英文交流能力。无需担心&#xff0c;签证官不会问太专业的问题&#xff0c;因为他们也不懂专业内容。到目前为止&#xff0c;没有一个博士生因为这个面试被拒签。毕…...

知识点大纲

学习方法 学习、整理笔记过程中&#xff0c;顺便整理出一个以问题为模版的大纲&#xff0c;到时候对着问题&#xff0c;就像是在和面试官讲解那样&#xff0c;相当于升级版的费曼学习法 除了看博客&#xff0c;问gpt外&#xff0c;亲自实验也是获取知识及加深印象的关键点 很…...

MySQL:库表操作

MySQL&#xff1a;库表操作 库操作查看创建字符编码集 删除修改备份 表操作创建查看删除修改 库操作 查看 查看存在哪些数据库&#xff1a; show databases;示例&#xff1a; 查看自己当前处于哪一个数据库&#xff1a; select database();示例&#xff1a; 此处由于我不处于任…...

8.3 End-to-end Data Protection (Optional)

8.3 End-to-end Data Protection (Optional) 为了提供从应用程序到NVM介质并返回到应用程序本身的稳健数据保护,可以使用端到端数据保护。如果启用了此可选机制,则将额外的保护信息(例如CRC)添加到逻辑块中,控制器和/或主机软件可以对其进行评估,以确定逻辑块的完整性。…...

python实现图像对比度增强算法

python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法 1.直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 2.自适应直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 3.连接组件标记算法详解算法步骤8连通与4连通公式Python 实现详细解释优缺…...

【D3.js in Action 3 精译_020】2.6 用 D3 设置与修改元素样式 + 名人专访(Nadieh Bremer)+ 2.7 本章小结

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…...

GIT命令学习 二

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…...

LeetCode 150, 112, 130

文章目录 150. 逆波兰表达式求值题目链接标签思路代码 112. 路径总和题目链接标签思路代码 130. 被围绕的区域题目链接标签思路代码 150. 逆波兰表达式求值 题目链接 150. 逆波兰表达式求值 标签 栈 数组 数学 思路 本题很像 JVM 中的 操作数栈&#xff0c;当写出以下三行…...

c++应用网络编程之五Windows常用的网络IO模型

一、Windows的网络编程 其实对开发者而言&#xff0c;只有Windows和其它平台。做为一种普遍流行的图形OS&#xff0c;其一定会与类Linux的编程有着明显的区别&#xff0c;这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架&#xff0…...

PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…...

鑫创SSS1700USB音频桥芯片USB转IIS芯片

鑫创SSS1700支持IIC初始外部编&#xff08;EEPROM选项),两线串行总线&#xff08;I2C总线&#xff09;用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM&#xff08;24C02~24C16&#xff09;接口&#xff0c;用于客户特定的USB视频、PID、…...

计算机视觉发展历程

文章目录 前言一、发展历程1&#xff09;、萌芽期&#xff08;1960s-1970s&#xff09;2&#xff09;、基础发展期&#xff08;1980s&#xff09;3&#xff09;、系统开发期&#xff08;1990s-2000s&#xff09;4&#xff09;、深度学习兴起期&#xff08;2010s&#xff09;5&a…...

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…...

Jackson详解

文章目录 一、Jackson介绍二、基础序列化和反序列化1、快速入门2、序列化API3、反序列化API4、常用配置 三、常用注解1、JsonProperty2、JsonAlias3、JsonIgnore4、JsonIgnoreProperties5、JsonFormat6、JsonPropertyOrder 四、高级特性1、处理泛型1.1、反序列化List泛型1.2、反…...

【算法】字符串

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、最长公共前缀二、最长回文子串三、二进制求和四、字符串相乘 引言 字符串题&#xff0c;大多数是模…...

Python酷库之旅-第三方库Pandas(037)

目录 一、用法精讲 116、pandas.Series.div方法 116-1、语法 116-2、参数 116-3、功能 116-4、返回值 116-5、说明 116-6、用法 116-6-1、数据准备 116-6-2、代码示例 116-6-3、结果输出 117、pandas.Series.truediv方法 117-1、语法 117-2、参数 117-3、功能 …...

iOS 左滑返回事件的控制

0x00 视图结构 1-根视图 1.1-控制器A 1.1.1-控制器B 1.1.1.1-控制器C 0x01 控制 通过设置 self.navigationController.interactivePopGestureRecognizer.enabled 为 YES 或 NO 来控制当面界面&#xff0c;是否能左滑返回 在 控制器B 的生命周期方法内&#xff0c;设置属性 s…...

重庆营销型网站随做的好处/无锡网站建设seo

明天就是教师节了&#xff0c;我们实验室的师兄姐弟们决定送给老师一件礼物&#xff0c;经过反复商议决定&#xff0c;礼物的范围被确定为绿色植物。于是今天上午&#xff0c;在烈日的阳光的照耀下&#xff0c;我们踏上了去往来太花卉的752路公共汽车。可谓千条万选&#xff0c…...

安徽平台网站建设公司/重庆seo团队

JSONP 和 JSON 的关系 事实上&#xff0c;JSONP 和 JSON 没有关系。若强行要有关系&#xff0c;也只能说 JSONP 这个技术使用了 JSON 这种数据格式。JSON 是一种数据交换格式。JSONP 是一种非官方跨域数据交互协议&#xff0c;是一种技术。 跨域是什么&#xff1f; 上面说了 JS…...

山西省住房和城乡建设厅网站首页/sem竞价托管费用

2019独角兽企业重金招聘Python工程师标准>>> 在ubuntu下的安装命令是 sudo apt-get install p7zip convmv 安装完之后&#xff0c;就可以用7za和convmv两个命令完成解压缩任务。 LANGC 7za x your-zip-file.zip convmv -f GBK -t utf8 --notest -r . 第一条命令用于…...

怎么通过网络推广/seo教程视频

MVC中如果用string&#xff08;string是包含html代码的字符串&#xff09;形式输出字符串&#xff0c;那么对应的html标签会自动转义&#xff0c;如果想直接输出html可用以下方法&#xff1a; (new HtmlString( "<h1>asdfasd</h1>")) 从网上还搜到&…...

网站二级目录怎么做301/自己做一个网站要多少钱

文档中&#xff1a;b 上页空格 下页q 退出文档的命令模式中&#xff1a;ggG 自动调整缩进.c编译运行&#xff1a;gcc hello.c (or:cc hello.c) ./a.out上翻下翻&#xff1a;shiftPgUpshiftPgDn文件/VIM中查找&#xff1a;/上一个结果&#xff1a;N下一个结果&#xff1a;n取消查…...

网站建设评标办法/重庆关键词seo排名

转载https://blog.csdn.net/gesanghua601/article/details/85131156 最近经常利用wireshark抓包&#xff0c;查看数据包的数据&#xff0c;遇到一二问题总结下&#xff0c;也分享给遇到同样问题的小伙伴儿~~ 抓包rtp难以直观看到裸码流格式数据&#xff0c;进而难以判断码流类…...