news 2026/5/5 21:12:01

使用malloc,calloc读取数组并安全释放,用realloc对数组进行扩容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用malloc,calloc读取数组并安全释放,用realloc对数组进行扩容

1.我们知道在函数对数组进行初始化数组的初始化结果会随着函数运行的结束而消失,所以可以用malloc申请堆内存的方式对数组进行初始化

#include<stdio.h> #include<stdlib.h> //设置一个能获取数组的函数 int* getArray() { int* res = (int*)malloc(100 * sizeof(int)); for (int i = 0; i < 100; i++) { res[i] = i; } return res; } int main() { int* arr = getArray(); for (int i = 0; i < 100; i++) { printf("%d\n", arr[i]); } free(arr);//free不会清空所在地址的数据,只是会收回对地址的使用权 arr = NULL; return 0; }

需要注意的点是:malloc开辟了一个400字节的内存,返回的结果是地址,因此本来是void*的返回结果类型需要用int*的结果去接收

这里还要注意的是要及时释放申请的堆内存,不然的话,长期未清理会导致系统卡死,同时,因为free函数只是收回对地址的使用权,所以还要将数组清空避免以后会读取到之前的数据

这样的话就可以实现在函数中对数组进行初始化了,但同时,malloc只是申请了内存,没有对数组进行初始化,当手动初始化的过程去掉之后,代码就会变成这个结果:

#include<stdio.h> #include<stdlib.h> //设置一个能获取数组的函数 int* getArray() { int* res = (int*)malloc(100 * sizeof(int)); return res; } int main() { int* arr = getArray(); for (int i = 0; i < 100; i++) { printf("%d\n", arr[i]); } free(arr);//free不会清空所在地址的数据,只是会收回对地址的使用权 arr = NULL; return 0; }

2.因此,我们可以使用calloc函数对数组进行自动初始化:

#include<stdio.h> #include<stdlib.h> //设置一个能获取数组的函数 int* getArray() { int* res = (int*)calloc(100 , sizeof(int)); return res; } int main() { int* arr = getArray(); for (int i = 0; i < 100; i++) { printf("%d\n", arr[i]); } free(arr);//free不会清空所在地址的数据,只是会收回对地址的使用权 arr = NULL; return 0; }

如图所示,calloc会自动把申请内存的元素初始化为0;

3.realloc对数组进行扩容

如下:

#include<stdio.h> #include<stdlib.h> int main(){ int* arr1 = (int*)malloc(10 * sizeof(int)); arr1 = (int*)realloc(arr1, 20 * sizeof(int)); arr1 = (int*)calloc(20, sizeof(int)); for (int i = 0; i < 20; i++) { printf("%d", arr1[i]); printf("\n"); } printf("\n"); free(arr1); arr1 = NULL; return 0; }

realloc可以将原本10个整型元素的空间开辟到20个,实现数组扩容的效果

运行结果如下:

使用realloc进行扩容的时候,需要注意的地方是realloc进行扩容,原来的结果会保存,新增加的部分分配垃圾值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 21:06:38

低查重AI写教材的方法,实测8款工具,快速搞定教材编制难题!

在编写教材时&#xff0c;如何才能有效应对多样化的需求呢&#xff1f; 不同年级的学生在认知水平上存在显著差异&#xff0c;过于艰深或简单的内容都不理想。课堂教学与自主学习之间的需求各异&#xff0c;教材的呈现方式需要灵活调整。不同地区的教育环境也大相径庭&#xf…

作者头像 李华
网站建设 2026/5/5 21:05:45

网盘直链下载助手:无需登录获取真实下载地址的完整指南

网盘直链下载助手&#xff1a;无需登录获取真实下载地址的完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

作者头像 李华
网站建设 2026/5/5 21:04:49

量子变分激活函数在KAN网络中的应用与优化

1. 量子计算与神经网络的跨界融合在深度学习领域&#xff0c;激活函数一直扮演着神经元的"开关"角色。最近实验室里有个有趣的发现&#xff1a;当我们把量子计算中的变分原理引入传统激活函数设计时&#xff0c;那些原本在Kolmogorov-Arnold网络&#xff08;KAN&…

作者头像 李华
网站建设 2026/5/5 21:02:10

Sunshine实战配置优化指南:5个关键场景的深度调优方案

Sunshine实战配置优化指南&#xff1a;5个关键场景的深度调优方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 作为自托管游戏串流服务器的核心&#xff0c;Sunshine的性能表现…

作者头像 李华
网站建设 2026/5/5 21:00:26

Java面向对象:Student类实战教学

定义Student类并创建对象根据以下要求定义并测试Student类&#xff1a;私有属性&#xff1a;name&#xff08;String&#xff09;、id&#xff08;String&#xff09;、age&#xff08;int&#xff09;无参构造方法&#xff1a;将name设为"未知"&#xff0c;id设为&q…

作者头像 李华