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

动态内存管理(malloc、calloc、realloc)

1.内存布局

内存布局的简单描述就是栈区、堆区、静态区

1)栈区:是来放置局部变量和函数形参等临时变量的。

2)堆区:是用来动态内存开辟的,malloc、calloc、free、realloc等函数都是在堆区上进行操作的。

3)静态区:是来放置全局变量、静态变量的。

今天所要描述的知识点都是在堆区上进行操作的。

2.动态内存函数

2.1 malloc
2.1.1 malloc是什么

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

1)如果开辟成功,则返回一个指向开辟好空间的指针

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

3)返回值的类型是 void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。

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

int main() { int* p = (int*)malloc(10 * sizeof(int)); if (p == NULL) { perror("main"); } for (int i = 0; i < 10; i++) { *(p+i) = i; } for (int i = 0; i < 10; i++) { printf("%d ", p[i]); } free(p); p = NULL; return 0; }

2.2 free

2.2.1 free是什么

free函数用来释放动态开辟的内存。需要注意以下两点:

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

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

int main() { int* p = (int*)malloc(10 * sizeof(int)); if (p == NULL) { perror("main"); } free(p); p = NULL; return 0; }
2.3 calloc
2.3.1 calloc是什么

calloc 函数也用来动态内存分配。它只有两点与malloc不同,其它功能与malloc相似,两点如下:

1)参数不同,calloc有两个参数,第一个参数为 num,第二个是size表示创建 num 个大小为 size

2)把开辟的空间的每个字节初始化为0。

#include<stdio.h> #include<stdlib.h> int main() { int i; int* pn = (int*)calloc(10, sizeof(int)); for(i = 0;i < 10;i++) printf("%d", pn[i]); printf("\n"); free(pn); return 0; }
2.4 realloc
2.4.1 realloc是什么

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

1. ptr 是要调整的内存地址

2. size 调整之后新大小

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

4. 如果开辟到新的空间上,这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。

5. realloc在调整内存空间的是存在两种情况: 1)原有空间之后有足够大的空间 2)原有空间之后没有足够大的空间 3)堆区上没有那么大的空间进行开辟

int main() { int* p = (int*)malloc(10 * sizeof(int)); if (p == NULL) { perror("main"); return; } int* temp = (int*)realloc(p, 20 * sizeof(int)); if (temp == NULL) { perror("main"); return; } p = temp; free(p); p = NULL; temp = NULL; return 0; }
2.4.3 realloc可以实现与malloc同样的功能
int main() { int* p = (int*)realloc(NULL, 10 * sizeof(int)); if (p == NULL) { perror("main"); return; } free(p); p = NULL; return 0; }
http://www.cnnetsun.cn/news/136460.html

相关文章:

  • 文本驱动可视化:5分钟掌握专业级图表制作
  • Clipper2多边形处理技术深度解析与实战应用
  • 错过再等十年:AI驱动的生物制药Agent智能实验设计新范式
  • 造纸车间的“信号指挥官”:耐达讯自动化Profinet六路集线器,让变频器“步调一致”
  • MaterialDesignInXamlToolkit实战指南:5步打造现代化WPF界面
  • 中东电商市场,正在成为中国卖家的必争之地!
  • 为什么你的边缘Agent总是部署失败?深度剖析常见陷阱与对策
  • 一文搞定前端CSS常用布局
  • Kotaemon用户行为分析插件开发教程
  • 额温枪PCBA方案开发全流程规划
  • Kotaemon针灸穴位查询:图文结合精准定位
  • 二极管钳位三电平VSG仿真模型 1.加入中点电位平衡 2.仿真有视频教程 3.THD均<5%
  • 通达信轻松买卖点副图,源码分享
  • 仅限内部分享:电力巡检Agent路径生成模型参数调优全记录
  • ChromePass密码找回工具:轻松获取Chrome保存的所有密码
  • BookmarkHub:告别浏览器书签混乱的智能同步神器
  • 51、保障系统安全:从漏洞扫描到灾难恢复的全面指南
  • DearPyGUI:为什么这款Python GUI框架正在重新定义界面开发?
  • Matlab模拟OAM螺旋谱展开,包括光束本征态、各类湍流、衍射、干涉下的OAM谱分布
  • 【核工业Agent故障处理全攻略】:揭秘高危场景下的7大应急响应策略
  • AI视频字幕生成工具:5步配置与实战应用全攻略
  • 如何快速上手SM3-PHP:5分钟掌握PHP国密加密的完整指南
  • 重构智慧书-第19条:事情刚开始时,不要让人抱过高期望。
  • 塔防无敌塔防小游戏Linux部署演示
  • leetcode 3652(定长滑动窗口/前缀和)
  • Vim插件管理器VAM:零基础小白也能轻松驾驭的终极神器
  • 30、Linux迁移案例:企业与政府的开源实践
  • 模块化多电平换流器(MMC)仿真分析:双闭环控制与最近电平逼近调制
  • Nacos3.1.1部署(Docker)
  • 【稀缺资料】20年经验专家解密:云边 Agent 延迟优化的3层架构设计