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函数。

你可能感兴趣的:(函数,C语言,内存分配)