news 2026/5/1 5:47:19

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态内存管理(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; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 4:56:01

linux文件同步机制(sync、fsync、fdatasync、O_SYNC)

sync&#xff1a;系统级文件同步&#xff0c;不等待数据写入完成&#xff0c;可能造成数据丢失&#xff0c;异步处理&#xff0c;由系统守护进程定时同步 fsync&#xff1a;特定文件&#xff08;fd&#xff09;的数据和元数据写入磁盘&#xff0c;后处理&#xff0c;开销较大 …

作者头像 李华
网站建设 2026/4/30 5:28:02

从红绿灯到让行规则,自动驾驶Agent如何精准决策?

第一章&#xff1a;自动驾驶Agent的交通规则 在自动驾驶系统中&#xff0c;Agent&#xff08;智能体&#xff09;必须遵循一套严谨的交通规则以确保道路安全与行为可预测性。这些规则不仅涵盖国家或地区的交通法规&#xff0c;还需结合实时环境感知与决策逻辑&#xff0c;使车辆…

作者头像 李华
网站建设 2026/5/1 5:46:01

Abaqus随机喷丸仿真全解析

abaqus 随机喷丸仿真&#xff0c;附带随机喷丸模型生成源程序&#xff0c;模型尺寸&#xff0c;丸粒尺寸&#xff0c;个数&#xff0c;角度&#xff0c;速度等均可自由改动源程序讲解视频&#xff0c;模型操作&#xff0c;后处理操作&#xff0c;模型文件均有喷丸微观仿真子程序…

作者头像 李华
网站建设 2026/4/21 19:13:22

Jimp图像处理服务器架构优化实战:从性能瓶颈到高效运行

当我们面对海量图片处理需求时&#xff0c;Jimp作为纯JavaScript图像处理库常常成为系统性能的瓶颈点。本文将从架构视角出发&#xff0c;通过三个关键层面的优化策略&#xff0c;帮助你构建高性能的Jimp图像处理服务&#xff0c;让服务器从容应对千万级图片处理请求。 【免费下…

作者头像 李华
网站建设 2026/4/30 5:47:12

10个月跨境电商企业暴涨194%,个人卖家出口额突破921亿!

上个月和深圳一位做跨境的卖家聊天&#xff0c;他感叹道&#xff1a;“感觉今年身边做跨境的&#xff0c;比去年多了一倍。数据显示&#xff0c;2025年前10个月&#xff0c;全国新注册的跨境电商相关企业已突破1万家&#xff0c;同比激增194.1%&#xff0c;去年一整年才新增 70…

作者头像 李华
网站建设 2026/4/12 17:12:14

理工男转行干跨境,仿真宠物年销30万单,拿下类目第一

客单价太高&#xff0c;消费者不买单怎么办&#xff1f;产品非刚需&#xff0c;退货率压不下来怎么办&#xff1f;这是许多独立站卖家&#xff0c;尤其是尝试高溢价品牌的卖家最头疼的两个问题。常规解法往往是降价促销或忍受高退货&#xff0c;但有一个品牌提供了截然不同的思…

作者头像 李华