70.【C语言】动态内存管理(重点)(3)

承接69.【C语言】动态内存管理(重点)(2)文章

目录

4.calloc函数

cplusplus网的翻译

提炼要点

使用

5.recalloc函数

使用说明

作用

调整内存空间的几种情况

1.原有空间之后有足够大的空间

2.原有空间之后没有足够大的空间

建议 

代码

 用recalloc函数来实现malloc函数

推荐阅读


4.calloc函数

cplusplus网站的介绍,点我跳转

cplusplus网的翻译

函数

calloc


void* calloc (size_t num, size_t size);

为含num个元素的数组分配内存块,每个元素有size个字节长,并且把他们的所有位初始化为0

实际结果是分配了一个num*size字节的初始化内存块,内存块的每个位为0

如果size为0,返回值依靠特定的库来实现,它可能是也可能不是一个空指针(即不确定是什么类型的指针,因为C标准没有定义),但返回的指针不应被解引用

参数


num:需要分配的num个元素

size:每个元素的大小(备注:size个字节)

size_t是无符号整型

返回值


成功时,指向内存块的指针被函数分配

指针的类型总为void*,它可以被转换为所需的数据指针类型以便解引用

如果函数不能为请求的内存块分配,则返回一个空指针

提炼要点

1.函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0

2.与malloc函数(具体见68.【C语言】动态内存管理(重点)(上))的区别只在于calloc函数会在返回地址之前把申请的空间的每个字节初始化为全0

3.使用malloc函数前加#include <stdlib.h>

4.养成良好习惯,判断是否为空指针

使用

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int*p=(int*)calloc(10,sizeof(int));
    if (p == NULL)
    {
        perror("calloc");
        return 1;
    }
    //使用
    int i = 0;
    for (i = 0; i < 10; i++)
        printf("%d ", *(p + i));
    //释放
    free(p);
    p = NULL;
    return 0;
}

int*p=(int*)calloc(10,sizeof(int));如果以int形式开辟空间要用sizeof(int);即开辟10个4字节

int*p=(int*)calloc(10,sizeof(int));改为int*p=(int*)malloc(10*sizeof(int));

因为没有初始化为0,而在内存中的字节数组为cd cd cd cd cd cd cd cd......

5.recalloc函数

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

使用说明

1.ptr是要调整的内存地址

2.size调整之后新大小

3.返回值为调整之后的内存起始位置

4.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间

作用

为了合理的使用内存,可以对内存的大小做灵活的调整

调整内存空间的几种情况

1.原有空间之后有足够大的空间

此时直接在原有空间之后增大空间

2.原有空间之后没有足够大的空间

此时recalloc按4步处理

1.在堆空间上找到新满足大小的连续空间

2.将旧空间的数据迁移到新空间

3.旧空间的内容被释放

4.返回新空间的地址

建议 

1.在第4步时,建议不要用原来的指针来接收新空间的地址,如果开辟新空间失败,则会返回空指针,

一旦原来的指针被赋为空指针,则原来的指针数据会被丢失

2.释放内存空间)(free(p);)时建议为p置NULL

代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int*p=(int*)malloc(10);
    if (p == NULL)
    {
        perror("mcalloc");
        return 1;//开辟失败,错误返回
    }
    //使用......
    //扩大为20个字节
    int* r_p=(int*)recalloc(p, 20);//新设一个r_p(全称recalloc_pointer)指针,
    if (r_p != NULL)
    {
        p = r_p;
    }
    else
    {
        perror("recalloc");
        return 1;//错误返回
    }
    //最后释放空间
    free(p);
    p = NULL;
    return 0;
}

 用recalloc函数来实现malloc函数

将recalloc函数的第一个参数设为NULL就等同malloc函数

recalloc(NULL,5);等同于malloc(5);

推荐阅读

68.【C语言】动态内存管理(重点)(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值