(持续更新中!!~)21、原来可以这样理解C语言_动态内存管理(3/7)calloc 和 realloc

目录

 3. calloc 和 realloc

3.1 calloc

3.2 realloc


 3. calloc 和 realloc

3.1 calloc

C语⾔还提供了⼀个函数叫 calloc , calloc 函数也⽤来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);

        • 函数的功能是为 num 个⼤⼩为 size 的元素开辟⼀块空间,并且把空间的每个字节初始化为0。

        • 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0。

举个例⼦:

#include <stdio.h>

#include <stdlib.h>

int main()
{
 int *p = (int*)calloc(10, sizeof(int));
 if(NULL != p)
 {
 int i = 0;
 for(i=0; i<10; i++)
 {
 printf("%d ", *(p+i));
 }
 }
 free(p);
 p = NULL;
 return 0;
}

输出结果:

 0 0 0 0 0 0 0 0 0 0        

        所以如果我们对申请的内存空间的内容要求初始化,那么可以很⽅便的使⽤calloc函数来完成任务。

3.2 realloc

        • realloc函数的出现让动态内存管理更加灵活。

        • 有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的使 ⽤内存,我们⼀定会对内存的⼤⼩做灵活的调整。那 realloc 函数就可以做到对动态开辟内存⼤ ⼩的调整。

函数原型如下:

void* realloc (void* ptr, size_t size);

• ptr 是要调整的内存地址

• size 调整之后新⼤⼩

• 返回值为调整之后的内存起始位置。

• 这个函数调整原内存空间⼤⼩的基础上,还会将原来内存中的数据移动到 新的空间。

• realloc在调整内存空间的是存在两种情况:

        ◦ 情况1:原有空间之后有⾜够⼤的空间

        ◦ 情况2:原有空间之后没有⾜够⼤的空间

情况1

        当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发⽣变化。

 情况2

        当是情况2 的时候,原有空间之后没有⾜够多的空间时,扩展的⽅法是:在堆空间上另找⼀个合适⼤⼩ 的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。

        由于上述的两种情况,realloc函数的使⽤就要注意⼀些。

#include <stdio.h>

#include <stdlib.h>

int main()
{
 int *ptr = (int*)malloc(100);
 if(ptr != NULL)
 {
 //业务处理 
 }
 else

 {
 return 1; 
 }
 //扩展容量 
 
 //代码1 - 直接将realloc的返回值放到ptr中 
 ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?) 
 
 //代码2 - 先将realloc函数的返回值放在p中,不为NULL,在放ptr中 
 int*p = NULL;
 p = realloc(ptr, 1000);
 if(p != NULL)
{
 ptr = p;
 }
 //业务处理 
 free(ptr);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值