C中存储器分配

ANSI C中的3个用于存储空间动态分配的函数。

#include<stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj,size_t size);
void *realloc(void *ptr,size_t newsize);


malloc,分配指定字节数的存储区,初始值不确定。

calloc,为指定长度的对象分配能容纳其指定个数的存储空间,该空间每个bit都初始化为0.

realloc,增加或减少以前分配区的长度,新增空间初始值不确定。当增加长度时,如果该存储区后又足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,并返回原指针,若没有足够空间,则分配另一个足够大的存储区。因为这种存储区可能会移动位置,所以不应使用任何指针指向该区中。

这些分配例程可以通过sbrk系统调用实现,该系统调用扩展或缩小一个进程的堆。但是大多数malloc和free的实现都不减少进程的存储空间,释放的空间可供以后再分配,将它们保持在malloc池中而不反回给内核。

大多数实现所分配的存储空间比要求的稍大,因为额外的空间用来记录分配块的长度、指向下一分配块的指针等等。这意味着如果写过一个分配区的尾端,则会修改后一个分配块的管理信息。这种错误是灾难性的,它可能不会马上表现出来,所以难以发现。


alloca函数

在当前函数的栈帧上分配存储空间,而不在堆中,优点是自动释放。缺点是系统在函数调用后不能再增加栈帧长度,所以就不支持alloca函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值