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 的空间
      
  • 分配失败则返回 空指针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: 动态分配内存,适用于不需要初始化的内存需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值