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

使用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进行扩容,原来的结果会保存,新增加的部分分配垃圾值。

http://www.jsqmd.com/news/759455/

相关文章:

  • DLSS Swapper终极实战指南:轻松管理游戏DLSS文件提升性能
  • GridPlayer:多视频同步播放终极指南 - 高效管理多个视频的免费工具
  • 3步搞定网页视频下载:VideoDownloadHelper浏览器插件全攻略
  • Super-Dev:模块化开发工具箱,一键搭建现代化项目骨架
  • YOLOv8.1.0正式版来了!一键pip install ultralytics后,为什么我的代码修改不生效?
  • 洛雪音乐桌面版:跨平台音乐聚合播放器的5大核心功能深度解析
  • 如何快速让Windows任务栏变透明:3步美化桌面终极指南
  • APKMirror开源客户端:构建安全Android应用生态的3个关键决策
  • Minecraft存档修复终极指南:5大挑战与专业解决方案
  • Navicat密码解密终极指南:5分钟快速找回遗忘的数据库连接密码
  • 别再用固定阈值了!用C++和3σ法则,5分钟搞定图像缺陷的智能分割
  • 实战qt开发:利用快马平台生成串口调试助手,附带数据可视化功能
  • 在国产飞腾CPU上,用ncnn部署你的第一个AI模型:从编译到推理的完整流程
  • 有哪些降重软件可以同时降低维普重复率和AI率?
  • 2026年相城二手木托盘厂家口碑大揭秘,谁是真正信赖之选?
  • AI时代,最该“系统升级”的不是孩子,而是父母
  • K8s调度器进阶:除了Gang Scheduling,Volcano的Binpack和DRF算法如何帮你省钱?
  • 别再乱下DLL了!手把手教你正确修复Visual C++ 2010 Debug库(msvcr100d.dll/msvcp100d.dll)
  • Illumina平台16S数据上传NCBI SRA全记录:从样本编号到邮件确认的完整时间线
  • Jetson Orin上编译spconv 2.1.21的保姆级避坑指南(CUDA 11.4 + Python 3.8)
  • Nginx配置踩坑记:除了404,页面刷新还报403 Forbidden怎么破?
  • 接入 Taotoken 后 API 密钥管理与审计日志带来的运维便利
  • 如何通过3个核心模块彻底改造Minecraft渲染体验?深度解析BetterRenderDragon技术架构
  • ai赋能电路设计:快马平台让multisim仿真具备智能分析与优化能力
  • Agent Attention:Transformer计算量太大?试试这个‘代理令牌’的轻量化方案
  • 避坑指南:在LuckFox Pico开发板上交叉编译OpenCV 3.4.16的完整流程(含CMakeLists配置)
  • 新手入门查看Taotoken控制台用量与账单明细指南
  • Eclipse 首选项(Preferences)详解
  • R 4.5低代码配置为何总失败?揭秘CRAN镜像源、Rprofile.site权限链、shiny.prerender缓存三重冲突机制
  • FPG财盛国际:多元化产品体系的综合呈现