c语言中alloc作用,C语言中malloc,realloc和calloc之间的区别和联系

321547fd2788e336bc33c02639d2342e.png

ANSI C说明了用于动态分配存储空间的三个功能

(1)malloc分配指定数量的内存字节. 该存储区域中的初始值不确定

(2)calloc是指定长度的对象,并分配可以容纳指定数量对象的存储空间. 该空间中的每一位都初始化为0

a481471d0fbc08fa6784436af551c361.png

(3)重新分配更改先前分配的区域的长度(增加或减少). 当增加长度时,可能需要将先前分配的区域的内容移动到另一个足够大的区域,并且新添加区域中的初始值不确定.

. 分配函数时重定位realloc()

让我们增加或减少先前分配的区域的长度(最常见的用法是增加区域).

83dea42ab0def27244857660e56ec31a.png

如果首先分配一个可以容纳长度为512的数组的空间并在运行时填充它,但是发现空间不足,则可以调用realloc扩展存储空间.

如果在该存储区域之后有足够的空间可扩展,则可以在原始存储区域中扩展到高地址方向,并返回传递给它的相同指针值.

如果原始存储区之后没有足够的空间,则realloc会分配另一个存储区,该存储区应足够大,以将现有5 1 2元素数组的内容复制到新分配的存储区.

90b3a2f7c7f45bf09fd0f9131b261d93.png

由于该存储区可能会移动,因此您不应在其中使用任何指针.

请注意,realloc的最后一个参数是存储区的newsize(新长度),而不是新旧长度之间的差. 作为一种特殊情况,如果ptr为空指针,则realloc与malloc具有相同的功能,并用于分配指定大小的存储区newsize.

这些分配例程通常是通过sbrk(2)系统调用实现的. 该系统调用扩展(或缩小)进程的堆. 尽管sbrk可以扩展或减少进程的存储空间,但是大多数malloc和free实现并不减少进程的存储空间. 释放的空间可以稍后分配,但是它们会保留在malloc池中,而不会返回到内核.

03d8072354c360a524be0aaf217fe7cf.png

应该注意,大多数实现分配的存储空间比所需的要多. 多余的空间用于记录管理信息-分配块的长度,指向下一个分配块的指针等等. 这意味着,如果写入分配区域的末尾,则下一个块的管理信息将被覆盖. 这种类型的错误是灾难性的,但是由于它不会很快暴露出来,因此很难检测到.

向后移动指向分配块的指针也可能会覆盖此块的管理信息. 可能发生的其他致命错误包括: 释放释放的块;当调用free时使用的指针不是三个alloc函数的返回值,等等. 由于难以跟踪内存分配错误,因此某些系统提供了这些函数的替代实现. 每次调用或释放这三个分配函数中的任何一个时,都会执行附加的错误检查. 在调用链接编辑程序时指定一个特殊的库,可以在程序中使用此版本的功能. 还有一些公共可用资源(例如4.3 + BSD提供的资源),并且在编译它们时使用特殊标志将使其他运行时检查生效.

由于存储分配器的操作对于某些应用程序的运行时性能很重要,因此某些系统提供了附加功能. 例如,SVR4提供了一个名为mallopt的功能,该功能使进程可以设置一些变量,并使用它们来控制存储空间分配程序的操作. 您还可以使用另一个名为mallinfo的函数来对存储空间分配器的操作进行统计. 查看您正在使用的系统的malloc(3)手册页,以查看这些功能是否可用.

.alloca函数

还有另一个值得一提的功能,这就是alloca. 它的调用顺序与malloc相同,但是它在当前函数的堆栈帧而不是堆上分配存储空间. 优点是,函数返回时,它会自动释放其使用的堆栈帧,因此您不必担心释放空间. 缺点是某些系统在调用函数后无法增加堆栈帧的长度malloc realloc calloc,因此它们无法支持alloca函数. 但是,许多软件包仍使用alloca功能malloc realloc calloc,并且许多系统都支持它.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-150400-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值