c语言(动态内存管理函数)

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

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

int arr[10] = {0};
char a;

但是上述的开辟空间的⽅式有两个特点:

但是上述的开辟空间的⽅式有两个特点:

• 空间开辟⼤⼩是固定的。

• 数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整 但是对于空间的需求,不仅仅是上述的情况。

有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道,那数组的编译时开辟空间的⽅式就不能满⾜了。 C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。

2. malloc和free

2.1 malloc

C语⾔提供了⼀个动态内存开辟的函数:

void* malloc(size_t size)

 这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。

• 如果开辟成功,则返回⼀个指向开辟好空间的指针。

• 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。

• 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃ ⼰来决定。

• 如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器。

2.2 free

C语⾔提供了另外⼀个函数free,专⻔是⽤来做动态内存的释放和回收的,函数原型如下:

void free (void* ptr);

 free函数⽤来释放动态开辟的内存。

• 如果参数 ptr 指向的空间不是动态开辟的,那free函数的⾏为是未定义的。

• 如果参数 ptr 是NULL指针,则函数什么事都不做。

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

3. calloc和realloc

3.1 calloc

C语⾔还提供了⼀个函数叫 calloc , calloc 函数也⽤来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);

• 函数的功能是为 num 个⼤⼩为 size 的元素开辟⼀块空间,并且把空间的每个字节初始化为0。

• 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0。  举个例⼦:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int *p = (int*)calloc(10, sizeof(int));
 if(NULL != p)
 {
     int i = 0;
     for(i=0; i<10; i++)
     {
         printf("%d ", *(p+i));
     }
 }
 free(p);
 p = NULL;
 return 0;
}

输出结果:

0 0 0 0 0 0 0 0 0 0

3.2 realloc

• realloc函数的出现让动态内存管理更加灵活。

• 有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时 候内存,我们⼀定会对内存的⼤⼩做灵活的调整。那 realloc 函数就可以做到对动态开辟内存⼤ ⼩的调整。

函数原型如下:

void* realloc (void* ptr, size_t size);

• ptr 是要调整的内存地址

• size 调整之后新⼤⼩

• 返回值为调整之后的内存起始位置。

• 这个函数调整原内存空间⼤⼩的基础上,还会将原来内存中的数据移动到 新 的空间。

• realloc在调整内存空间的是存在两种情况:

◦ 情况1:原有空间之后有⾜够⼤的空间

◦ 情况2:原有空间之后没有⾜够⼤的空间

情况1

当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发⽣变化。

情况2

当是情况2 的时候,原有空间之后没有⾜够多的空间时,扩展的⽅法是:在堆空间上另找⼀个合适⼤⼩ 的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php 对接Mintegral汇量海外广告平台收益接口Reporting API

今天对接的是Mintegral广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Mintegral后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://cdn-adn-https.rayjump.com/cdn-adn/reporting_api/MintegralRA.…

Java基于微信小程序的二手交易系统的实现(V2.0)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python 技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#…

C++初阶:string类相关练习题

目录 1. 字符串相加2. 反转字母3. 字符串中唯一字母4. 字符串中最后一个单词5. 验证回文串6. 反转字符II7. 反转字符串中的单词8. 字符串相乘 1. 字符串相加 题目信息&#xff1a; 题目连接&#xff1a; 字符串相加 class Solution { public:string addStrings(string num1, s…

Ubuntu24.04即将发布,支持Linux内核6.8。该版本会有哪些亮点?

更多内容在 Canonical 计划 2024 年 4 月发布 Ubuntu 24.04 LTS 发行版&#xff0c;将获得长达 12 年的支持。Ubuntu 24.04 LTS&#xff0c;代号“Noble Numbat”&#xff0c;是Ubuntu发行版的最新长期支持&#xff08;LTS&#xff09;版本。12年的支持意味着你会得到 五年的维…

谷歌DeepMind推出3D游戏AI代理SIMA,实现自然语言操控游戏新纪元

近日&#xff0c;谷歌DeepMind研究团队推出了一款名为SIMA的创新AI代理&#xff0c;专为3D游戏环境设计。这款代理独树一帜&#xff0c;无需访问游戏源代码或依赖定制API&#xff0c;仅通过输入图像和简单的自然语言文本指令&#xff0c;便能实现与人类玩家相当的游戏操作。 AI…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

计算机硕士,毕业直接后端开发岗,选择C++还是java?

我自己是一名工作多年的C程序员&#xff0c;大学学习的编程语言就是C/C&#xff0c;参加工作后自学了Python、Java、Golang等语言。 现在从事自动驾驶行业的工作&#xff0c;工作中主要使用的编程语言是C和Python。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整…

canopen使用

CAN 总线协议 1&#xff09;、启动SDO 下载协议 ccs&#xff1a;客户端 指定命令 1&#xff1a;开始下载请求 •scs&#xff1a;服务器命令符 3&#xff1a;开始下载响应 •n&#xff1a;只有当e 1和s1&#xff0c;否则为0。如果有效则表示字节在d不这样做的数量有效包…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

3个好用的WP免费主题

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 经典的红色免费wordpress主题 这是一款经典的免费wordpress主题&#xff0c;被广泛应用于多个行业的网站。 https…

SQL:窗口函数之OVER()

窗口函数 通用格式 “函数 OVER (PARTITION BY 分组 ORDER BY 排序依据 升降序)”。 这里记录下OVER() 以及搭配LEAD/LAG函数的使用方法&#xff08;执行平台Impala&#xff09; 目录 OVER函数1、不加条件的OVER函数——得到所有的汇总结果2、仅有排序的OVER函数——得到按顺序…

HAL库W25Q16+fatfs文件系统移植

配置时钟树 配置时钟树时钟频率为72 SPI1外挂SPIflash 其他不用改这里挂的是一个W25Q16 文件分类管理 生成原始代码 加入W25Q16的驱动代码 忘记配片选线了&#xff0c;这里加上 /*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin GPIO_PIN_4;GPIO_InitStruct.Mode GPIO_…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.5 科目余额查询理

SAP提供了强大的科目余额查询功能&#xff0c;可以查询科目的借贷方及余额&#xff0c;同时&#xff0c;也可以追溯到明细凭证。在凭证记账后&#xff0c;科目的余额就会同步得到更新。预制凭证是不更新科目余额的。 科目余额查询及追溯的操作步骤 路径&#xff1a;SAP菜单&g…

我的春招求职面经

智能指针在面试时经常被问到&#xff0c;最近自己也在写&#xff0c;有一点思考&#xff0c;于是找到了这样一个题目&#xff0c;可以看看&#xff0c;上面这个代码有什么问题&#xff1f;留言区说出你的答案吧&#xff01; 最后分享一下之前的实习->春招->秋招等文章汇总…

atomgit访问令牌就创建的时候显示一下

AtomGit 是开放原子开源基金会提供的代码托管平台&#xff0c;帮助团队更快、更安全地交付更好的软件。 在创建访问令牌的时候&#xff0c;发现创建之后点不出来令牌字段&#xff0c;不像其它网站会在令牌列表那里显示出来。在“我的令牌”页面只能看到令牌名字和权限&#xff…

设计模式—组合模式

定义: 组合模式&#xff08;Composite Pattern&#xff09;又称为合成模式、部分-整体模式&#xff08;Part-Whole&#xff09;&#xff0c;主要用来描述部分与整体的关系。 定义&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使用户对单个对象和…

适用于vue3的vant4组件 没有日期时间选择器

项目中需要用到日期和时间一同选择的场景 本来想用 如下代码 van-datetime-picker 发现咋整也不好使 刚开始还以为是引入的问题 后来发现是vant4根本就没这玩应了… <van-datetime-pickerv-model"currentDate"type"datetime"title"选择完整时间&q…

数据结构之排序一

目录 1.排序 一.概念及其分类 二.排序的稳定性 2.插入排序 一.基本思想 二.插入排序的实现 复杂度 稳定性的分析 3.希尔排序 一.预排序代码的实现 二.希尔排序代码实现 复杂度分析 4.clock函数 1.排序 一.概念及其分类 说到排序&#xff0c;我们都不陌生&#x…

向上生长

&#xff08;1&#xff09; 我记得2010年&#xff0c;在中国的苹果应用商店里&#xff0c;充斥的App还有很多&#xff1a;日历App、天气App、电池省电App、记事本App…。但这已经过去了2007-2008-2009三年&#xff0c;这些应用仍然很欢。 我有一个朋友算是中国最早一批开发iOS …

vue.js+element-ui的基础表单

遇到原生的html小型单页应用时&#xff0c;是脱离了vue框架&#xff0c;而我们又想使用vue的语法和element的组件加快我们的开发速度&#xff0c;这个时候就需要引用他们的js了。技术栈即htmlvue.jselement-ui。而使用它们的方法也很简单&#xff0c;引入对应的js和css文件即可…