malloc、calloc、realloc、alloca的区别
前言
malloc、calloc、realloc、alloca这些都是用于内存分配的函数,但是作用 以及 分配的内存区域不同。
- malloc、calloc、realloc分配的内存是在堆中的
- alloca分配的内存是在栈中的
在堆内分配内存
特点
- 在堆内分配内存都得手动调用free进行手动释放
- 否则会内存泄露(分配的内存放着不用,然而内存是有限的)
malloc(Memory Allocation 内存分配)
作用
在 堆 中分配指定大小的连续内存块
特点
分配的内存不会进行初始化,内容随机
函数声明
void* malloc(size_t size);
使用说明
-
成功分配则 返回一个 指向分配内存的指针(无类型指针void*)
- 因为是返回的是无类型指针void* 所以需要进行强制类型转换
int* ptr = (int*)malloc(5 * sizeof(int)); // 分配 5 个 int 的空间
- 因为是返回的是无类型指针void* 所以需要进行强制类型转换
-
分配失败则返回 空指针NULL
calloc(Contiguous Allocation 连续分配)
作用
在 堆 中分配 指定块数量及每块大小 的连续内存块,并将每个字节初始化为0
特点
分配的内存会默认初始化为 0
函数声明
// num:块数量 size:每块大小
void* calloc(size_t num, size_t size);
使用说明
-
成功分配则 返回一个 指向分配内存的指针(无类型指针void*)
int* ptr = (int*)calloc(5, sizeof(int)); // 分配 5 个 int 的空间,初始化为 0 -
分配失败则返回 空指针NULL
realloc(Reallocate Memory 重新分配内存)
作用
修改已分配内存块的大小(增大或缩小 malloc 或 calloc 分配的内存)
- 如果旧内存块无法扩展,realloc 会分配新的内存块并将原内容复制到新块。
- 如果新大小 比 原大小 大,新增的内存内容不初始化。
- 如果新大小 比 原大小 小,则保留原内存中前 new_size 字节 内容不变,释放后面多余的内存
函数声明
// ptr:之前已分配的内存指针 new_size:新的内存大小
void* realloc(void* ptr, size_t new_size);
使用说明
-
成功分配则 返回一个 指向分配内存的指针(无类型指针void*)
ptr = (int*)realloc(ptr, 10 * sizeof(int)); // 将内存大小调整为 10 个 int -
分配失败则返回 空指针NULL
在栈内分配内存
特点
- 栈内分配的内存不需要手动释放,它会随着函数结束后自动释放
alloca(Allocate on Stack 在栈中分配)
作用
在 栈 中分配内存
特点
- 比 在堆中分配内存 要快
函数声明
void* alloca(size_t size);
使用说明
-
成功分配则 返回一个 指向分配内存的指针(无类型指针void*)
int* ptr = (int*)alloca(5 * sizeof(int)); // 栈上分配 5 个 int 的空间 -
分配失败则返回 空指针NULL
总结

使用场景
- alloca: 临时内存需求,快速分配和自动释放,但注意栈溢出风险。
- realloc: 动态调整已分配内存的大小,适用于动态增长或缩减内存。
- calloc: 分配并初始化为 0,适用于需要清零的动态内存。
- malloc: 动态分配内存,适用于不需要初始化的内存需求。
2056

被折叠的 条评论
为什么被折叠?



