14.动态内存分配

当你声明数组的时候,你必须用一个编译时常量指定数组的长度。但是,通常数组的长度常常在运行的时候才能确定。
这是由于它所需要的内存取决于输入的数据。

malloc 和 free

C 函数库提供了两个函数: mallocfree ,分别用于执行动态内存分配和释放。
这些函数维护一个可用的内存池。当一个程序另外需要一些内存时,就调用 malloc 函数,
malloc 从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。
这块内存此时并没有以任何方式进行初始化。如果对这块内存进行初始化非常重要,
你要么自己动手对它进行初始化,要么使用calloc函数。当一块以前分配的内存不再使用时,
程序使用 free 函数把它归还给内存池以供后需。

函数原型:
void *malloc(size_t size);
void free(void *pointer);

malloc 的参数就是需要分配的内存字节数。如果满足这个需求,返回一个指向被分配的内存的起始指针。
同时,malloc 实际分配的内存可能会多一点。
如果不满足,返回 Null

free 的参数必须要么是 Null,要么是之前从 malloc,calloc或 realloca返回的值。
向 free 传递 null不会产生任何效果。

calloc 和 realloc

原型:

void *calloc(size_t num_element, size_t element_size);
void realloc(void *ptr, size_t new_size);

calloc 也用于分配内存。与 malloc 的区别是后者在返回指向内存的指针之前会初始化。
如果你的程序只是想把一些值存到数组中,那么初始化是浪费时间的。
另外一个小区别是它们请求内存数量的方式不一样。 
calloc 的参数包括所需元素的数量和每个元素的字节数。根据这些值,它能够算出总共需要分配的内存。

realloc 函数用于修改一个原先已经分配的内存块大小。使用这个函数,你可以使一块内存扩大或者缩小。
如果它用于扩大一个内存,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存的后面,
新内存并未以任何方法初始化。如果它用于缩小一块内存,该内存块尾部的部分便被拿掉,
剩余部分内存的原先内容依然保留。
如果原先的内存块无法改变大小,realloc将分配另外一块正确大小的内存,
并把原先那内存块的内容复制到新的块上。因此,使用realloc之后,你就不能再使用执行旧内存的指针,
而是应该使用realloc返回的新指针。
最后,如果realloc函数的第一个参数是null,那么它的行为就和malloc一样。

动态分配的内存必须整块释放。realloc 可以缩小内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值