C 语言 动态内存分配:malloc /calloc/realloc /free

一、为什么要用动态内存

普通数组固定大小 ,不能随时扩容、缩小;动态内存可以程序运行时 手动申请 / 释放 堆区内存,大小灵活。


二、四个函数头文件

c

运行

复制代码
#include <stdlib.h>

1. malloc 申请未初始化内存

作用

在堆上申请指定字节数内存不初始化,里面是随机垃圾值。

语法

c

运行

复制代码
void *malloc(size_t size);

示例

c

运行

复制代码
// 申请能存5个int的内存
int *p = (int *)malloc(5 * sizeof(int));
  • 申请成功:返回起始地址
  • 申请失败:返回 NULL

2. calloc 申请并初始化为 0

作用

申请内存,自动全部初始化为 0

语法

c

运行

复制代码
void *calloc(size_t num, size_t size);

num:元素个数size:每个元素字节大小

示例

c

运行

复制代码
int *p = (int *)calloc(5, sizeof(int));

直接 5 个 int 全部初始化为 0,不用手动清零。


3. realloc 重新调整内存大小

作用

给已有的动态内存扩容 或 缩容

语法

c

运行

复制代码
void *realloc(void *ptr, size_t newSize);

示例

c

运行

复制代码
// 原来5个int,扩容到10个
p = (int *)realloc(p, 10 * sizeof(int));
  • 会保留原来数据
  • 若原位置不够,会换新地址拷贝数据,释放旧内存

4. free 释放动态内存

作用

把堆上申请的内存归还系统,防止内存泄漏。

语法

c

运行

复制代码
void free(void *ptr);

示例

c

运行

复制代码
free(p);
p = NULL;   // 防止野指针

用完必须 free,否则一直占用内存。


三、四大函数区别一眼看懂

表格

函数 作用 是否初始化 参数特点
malloc 申请堆内存 随机值,不初始化 只传总字节数
calloc 申请堆内存 自动初始化为 0 个数 + 单个大小
realloc 调整已有内存大小 保留原数据 原指针 + 新大小
free 释放动态内存 --- 只传指针
相关推荐
格林威4 分钟前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
小大宇30 分钟前
Python 集成 Conda
开发语言·python·conda
天空'之城32 分钟前
C 语言工业级通用组件手写 08:精准软件消抖
c语言·嵌入式开发·工业级组件·软件消抖·按键防抖
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
小大宇2 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
Legendary_0082 小时前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
柒星栈2 小时前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之2 小时前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
这是个栗子3 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
蓝创工坊Blue Foundry3 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel