动态内存管理申请调整和释放

动态内存管理存放在内存中的堆区中
动态内存分配的函数:malloc、calloc、realloc、free

malloc函数(内存申请空间)无初始化

在这里插入图片描述
分配一个大小字节的内存块,返回一个指向该块开头的指针。
新分配的内存块的内容没有初始化,保留不确定的值。
如果size为0,则返回值取决于特定的库实现(它可能是也可能不是空指针),但是返回的指针不能被解引用。
malloc:是用来申请内存空间的

free函数(动态内存释放)

在这里插入图片描述
free:可以释放申请的内存
主动释放动态开辟的内存空间
注意free不能将接收的指针赋值为NULL,需要主动赋值为NULL

代码:

#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>//malloc头文件
int main()
{
    int* p =(int*)malloc(40);//申请40个字节来存放10个整形
    //因为malloc返回为void*,需要强制类型转换为int*
    if(p==NULL)
    {
        printf("%s", strerror(errno));
        return 1;
    }
    //40个字节存放1-10
    for (int i = 0; i < 10;i++)
    {
        *(p + i) = i + 1;
        //p是起始位置地址,为整形,访问数组下标为i的元素,跳过int类型i的字节个数
        //i+1赋值
    }
    //打印
     for (int i = 0; i < 10;i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
}

开辟空间失败

 int* p =(int*)malloc(INT_FAST64_MAX);
    if(p==NULL)
    {
        printf("%s", strerror(errno));
        return 1;
    }

calloc函数(内存空间申请)初始化

在这里插入图片描述
malloc不存放元素打印出随机值,malloc申请到的空间没有初始化,直接返回的起始地址,效率高
而calloc申请好空间后,会把空间初始化为0,返回起始地址

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int* p=(int*)calloc(10,sizeof(int));
    //参数为元素个数和类型占用几个字节
    if(p==NULL)
    {
        perror("calloc");
        return 1;
    }
    //使用
    for (int i = 0; i < 10;i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
    return 0;

realloc函数(调整空间)

在这里插入图片描述
如果第一个参数传入的一个NULL指针的话,功能相当于malloc功能

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    //内存空间开辟
    int* p = (int*)malloc(5 * sizeof(int));
    if(p==NULL)
    {
        perror("malloc");
        return 1;
    }
    //使用
    for (int i = 0; i < 5;i++)
    {
        *(p + i) = 1;
    }
    //调整
     int* ptr = (int*)realloc(p, 10 * sizeof(int));
     //可以调整原申请空间的大小
     //使用一个临时的指针来接收,保证p指针数据不丢失
     if(ptr!=NULL)//判断临时开辟的空间是否失败
     {
         p = ptr;
         ptr=NULL;
     }
     for (int i = 0; i < 10;i++)
    {
        printf("%d ", *(p + i));
    }
    free(p);
    p = NULL;
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值