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

动态内存四个函数

文章目录

      • 1. `malloc`
      • 2. `calloc`
      • 3. `realloc`
      • 4. `free`

在C语言中,malloccallocreallocfree 是用于动态内存管理的标准库函数,它们定义在 <stdlib.h> 头文件中。以下是这些函数的用法:

1. malloc

malloc 函数用于在堆区分配指定大小的内存块。

  • 原型
    void* malloc(size_t size);
    
  • 参数
    • size:需要分配的内存字节数。
  • 返回值
    • 成功时,返回指向分配内存的指针。
    • 失败时,返回 NULL
  • 用法
    int* ptr = (int*)malloc(10 * sizeof(int)); // 分配10个整数的空间
    if (ptr == NULL) {// 分配失败,处理错误
    }
    

2. calloc

calloc 函数用于在堆区分配指定数量的内存块,并将每个内存块初始化为0。

  • 原型
    void* calloc(size_t num, size_t size);
    
  • 参数
    • num:需要分配的内存块数量。
    • size:每个内存块的大小。
  • 返回值
    • 成功时,返回指向分配内存的指针。
    • 失败时,返回 NULL
  • 用法
    int* ptr = (int*)calloc(10, sizeof(int)); // 分配10个整数并初始化为0
    if (ptr == NULL) {// 分配失败,处理错误
    }
    

3. realloc

realloc 函数用于调整之前由 malloccallocrealloc 分配的内存块的大小。

  • 原型
    void* realloc(void* ptr, size_t size);
    
  • 参数
    • ptr:指向之前分配的内存块的指针。
    • size:新的内存块大小。
  • 返回值
    • 成功时,返回指向新分配内存的指针。
    • 失败时,返回 NULL。原内存块不会被释放,需要手动释放。
  • 用法
    int* ptr = (int*)malloc(10 * sizeof(int));
    // ... 使用 ptr ...
    ptr = (int*)realloc(ptr, 20 * sizeof(int)); // 增加ptr指向的内存块大小到20个整数
    if (ptr == NULL) {// 重新分配失败,处理错误
    }
    

4. free

free 函数用于释放之前由 malloccallocrealloc 分配的内存块。

  • 原型
    void free(void* ptr);
    
  • 参数
    • ptr:指向需要释放的内存块的指针。
  • 返回值
    • 无返回值。
  • 用法
    int* ptr = (int*)malloc(10 * sizeof(int));
    // ... 使用 ptr ...
    free(ptr); // 释放ptr指向的内存块
    ptr = NULL; // 避免野指针
    

在使用这些函数时,需要注意以下几点:

  • 使用 malloccallocrealloc 分配内存后,应该检查返回的指针是否为 NULL,以处理内存分配失败的情况。
  • 释放内存后,应该将指针设置为 NULL,以避免产生野指针。
  • 调用 realloc 时,如果新的大小小于原大小,原内存块的内容可能会丢失。如果新的大小大于原大小,新分配的内存部分不会被初始化。
http://www.lryc.cn/news/403973.html

相关文章:

  • DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据
  • 高性能分布式IO系统BL205 OPC UA耦合器
  • live555 rtsp服务器实战之doGetNextFrame
  • Nginx系列-3 servername优先级和location优先级和常用正则表达式
  • python—爬虫爬取电影页面实例
  • 实现图片拖拽和缩小放大功能。
  • 昇思25天学习打卡营第18天|munger85
  • nginx配置文件说明
  • 用不同的url头利用Python访问一个网站,把返回的东西保存为txt文件
  • 一文掌握Prometheus实现页面登录认证并集成grafana
  • 欢迎来到 Mint Expedition:Web3 和 NFT 的新时代开始
  • 针对环境构图的全局一致性扫描点云数据对齐(Graph SLAM)
  • Matlab学习笔记01 - 基本数据类型
  • 基于重要抽样的主动学习不平衡分类方法ALIS
  • Python爬虫(基本流程)
  • primeflex教学笔记20240720, FastAPI+Vue3+PrimeVue前后端分离开发
  • 移动设备安全革命:应对威胁与解决方案
  • 【C语言】 链表实现学生管理系统(堆区开辟空间)
  • STM32实战篇:按键(外部输入信号)触发中断
  • Android SurfaceView 组件介绍,挖洞原理详解
  • day2加餐 Go 接口型函数的使用场景
  • 摄像头 RN6752v1 视频采集卡
  • 记录vivado自带IP iBert眼图近端回环
  • js | Core
  • Log4J reminder
  • Unity XR Interaction Toolkit(VR、AR交互工具包)记录安装到开发的流程,以及遇到的常见问题(一)!
  • MongoDB文档整理
  • 【AI学习】关于Scaling Law的相关学习
  • 学习小记-Kafka相较于其他MQ有啥优势?
  • 技能 | postman接口测试工具安装及使用