C语言 malloc realloc calloc

本文介绍了C语言中的三种内存管理函数:malloc、realloc和calloc的基本用法及区别。malloc用于分配指定大小的内存;realloc用于调整已分配内存的大小;calloc不仅分配内存还会将其初始化为零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 malloc 

在C语言中,用到指针就会想到动态分配空间,动态分配空间最基础的就是malloc。


头文件:stdlib.h或malloc.h(realloc和calloc也一样)


void *malloc(size_t size);


功能:分配长度为num_bytes字节的内存块


返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。


malloc实现:

简单来说,就是在堆上将可用的空间链接起来,形成一块块可用的空间,malloc就是找到那个空间的信息然后返回它的地址。定义了Header保存每个存储器块的信息,信息有指向下个链表的指针,当前分配的长度,还有存储器元素排在合理的字节边界上,根据系统不同,都不一样。



2 realloc

void * realloc(void *__ptr, size_t __size);


功能:更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。


如果将分配的内存减少,realloc仅仅是改变索引的信息。


如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。


因为有可能分配不成功,所以关于这一点的确要注意,最好如下:
int *q;
q = (int *) realloc (p, sizeof(int)  * 15);

if( ! q )

{

    p = q;

}


3 calloc

 void* calloc (size_t num, size_t size);

功能:calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。


跟malloc的区别:
  calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。


一个在努力中的未来程序员,如果有更好的想法,欢迎评论。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值