【ARM 嵌入式 C 入门及渐进 21 -- 内存分配相关函数malloc 与 realloc】

请阅读【嵌入式开发学习必备专栏 】


文章目录

malloc 与 realloc

mallocrealloc 都是 C 语言标准库中的函数,用于动态内存分配。它们在使用上有明显的区别:

malloc

  • malloc(Memory Allocation)用于分配一块新的未初始化的内存。
  • 分配的内存大小是由参数指定的,单位是字节。
  • 如果内存分配成功,它返回一个指向分配内存的指针。
  • 如果内存分配失败,它返回 NULL
  • 分配的内存内容是未初始化的,可能包含任意数据(垃圾值)。
c 复制代码
#include <stdlib.h>

int *arr = (int *)malloc(10 * sizeof(int)); // 分配一个整型数组,大小为 10 个整数
if (arr == NULL) {
    // 处理内存分配失败
}

realloc

  • realloc(Re-Allocation)用于重新分配之前已经分配的内存块的大小。
  • 它允许增大或减小原有内存块的大小。
  • 第一个参数是指向原有内存块的指针,第二个参数是新的内存大小。
  • 如果内存重新分配成功,它返回一个指向新内存的指针,可能与原来的指针不同。
  • 如果内存重新分配失败,它返回 NULL,且原有内存块保持不变。
  • 当增大内存块时,新分配的内存部分内容是未初始化的。
  • 如果新的内存大小为零,行为与标准不一定一致,有些实现可能返回 NULL,有些可能返回一个可安全 free 的非 NULL 指针。
c 复制代码
#include <stdlib.h>

int *arr = (int *)malloc(10 * sizeof(int)); // 最初分配内存
if (arr == NULL) {
    // 处理内存分配失败
}
int *new_arr = (int *)realloc(arr, 20 * sizeof(int)); // 尝试重新分配为更大的大小
if (new_arr == NULL) {
    // 处理内存重新分配失败,原始 arr 依然有效,需要最终释放
} else {
    arr = new_arr; // 更新 arr 指针为新内存的地址
}

主要差异点

  1. 目的 : malloc 用于初次分配内存,realloc 用于修改已分配内存的大小。
  2. 初始化 : malloc 不会初始化内存,realloc 保留原有内存内容并且可能会添加未初始化的内存。
  3. 指针 : realloc 需要一个已分配内存的指针参数,malloc 不需要。
  4. 使用场景 : 当 不确定最初需要多少内存,或者 的内存需求可能会改变时,使用 realloc 可以调整内存大小。

在使用 realloc 时,如果返回一个新的指针, 应该用新指针替换旧指针。如果 realloc 调用失败,它返回 NULL,但原先的内存还是要通过旧指针来释放的。

一定要记得,用 malloccallocrealloc 分配的内存都必须通过 free 函数来释放,以避免内存泄漏。

相关推荐
森焱森2 分钟前
60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 驱动简单解析)
c语言·单片机·算法·架构·开源
专注VB编程开发20年13 分钟前
各版本操作系统对.NET支持情况(250707更新)
开发语言·前端·ide·vscode·.net
我喜欢就喜欢21 分钟前
RapidFuzz-CPP:高效字符串相似度计算的C++利器
开发语言·c++
千帐灯无此声22 分钟前
Linux 测开:日志分析 + 定位 Bug
linux·c语言·c++·bug
莫彩24 分钟前
【Modern C++ Part7】_创建对象时使用()和{}的区别
开发语言·c++
星光542229 分钟前
飞算JavaAI:给Java开发装上“智能引擎”的超级助手
java·开发语言
June bug1 小时前
【Python基础】变量、运算与内存管理全解析
开发语言·python·职场和发展·测试
醇醛酸醚酮酯1 小时前
Qt项目锻炼——TODO(五)
开发语言·qt
蹦蹦跳跳真可爱5891 小时前
Python----OpenCV(几何变换--图像平移、图像旋转、放射变换、图像缩放、透视变换)
开发语言·人工智能·python·opencv·计算机视觉
骁的小小站1 小时前
HDLBits刷题笔记和一些拓展知识(十一)
开发语言·经验分享·笔记·其他·fpga开发