存储空间的分配(UNIX环境高级编程笔记)

  (1)malloc,分配指定字节的存储区。此存储区中的初值不确定。
  (2)calloc,为指定数量指定长度的对象分配存储空间。该空间的每一bit都初始化为0。
  (3)realloc,增加或减少以前分配区的长度。当长度增加后,可能需要将以前分配区的内容移动到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域内的初始值则不确定。

#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
        3个函数的返回值:若成功,返回非空指针;若出错,返回NULL
void free(void *ptr);

  这3个alloc函数都返回通用指针void *,所以如果在进程中包含了#include <stdlib.h>,那么我们将这些函数的返回的指针赋予一个不同类型的指针时,就不需要进行显式的进行强制类型转换。
  函数free释放ptr指向的储存空间。被释放的空间通常被送入可用存储区池,以后可在调用上述3个alloc函数时再分配。
  realloc函数可以增、减以前分配的存储区的长度。最后一个参数是新储存区的新长度,不是新旧存储区之间的差。若ptr是一个空指针,则realloc的功能和malloc相同。
  这些分配例程通常通过sbrk系统调用实现。该系统调用扩充或者缩小进程的堆。
  大多数实现所分配的存储空间比所要求的要大一点,额外的空间用来记录管理信息——分配块的长度、指向下一分配块的指针等。
  在动态分配的缓冲区之前或之后进行写操作,破坏的可能不仅仅是该区的管理记录信息。
  其他可能造成的致命性错误是:释放一个已经释放的块;调用free时所用的指针不是alloc函数的返回值等。如果一个进程调用malloc函数,但是却忘记free,则此进程占用的存储空间就会连续增加,这被称为泄露(leakage)。如果不调用free函数释放不再使用的空间,那么进程地址空间的长度就会慢慢增加,甚至不再有地址空间。此时,由于过度的换页开销,会造成性能下降。
  与很多可代替malloc和free的函数。某些系统已经提供代替存储空间分配函数的库。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值