• C语言中malloc(),free(),calloc(),realloc()


    申请内存malloc()在申请内存时不会对内存进行初始化赋值

    在申请内存后,没有对内存进行初始化的话,这段内存中就存储着系统随机值。

    int n = 5;
    int* p = (int*)malloc(n * sizeof(int));
    
    • 1
    • 2
    1. malloc(size):size就是你想开辟的内存的字节大小。我们通常想要用这段内存存储n个某种类型的数据,所以如果我们想要用这段内存存储n个int大小(四字节大小)的数据(需要n*4字节内存),就使用malloc(n * sizeof(int))或malloc(n * 4)。
    2. (int:int就是你想要分割的单个格子大小*。系统不知道这段内存是单个一段,还是你想将其分为几个单元格。所以我们需要给系统明确我们想要怎么样,如果我们想要用这段内存存储int大小的数据,就用int标记,系统自动识别,将这段内存分隔为4字节大小的连续单元格。还因为这是开辟的内存地址,需要用指针来指向所以用(int*)将其强转为指针
    3. int p*:对应想要存储的数据大小,就要选择对应指针解析存储单元大小相同,指针加整型能力相同的指针类型。malloc()将开辟好的内存起始地址返回回来,用指针进行保存。未成功开辟内存就返回一个空指针。

    有两种给内存初始化的方式:
    (1)直接for循环给内存中每个单元格赋值。

    for (int i = 0; i < n; i++) {
    	p[i] = 1;
    }
    
    • 1
    • 2
    • 3

    (2)以string.h头文件中的memset()函数实现内存初始化。

    memset(初始化内存(void*),int value,unsigned int size);
    //初始化内存:所要初始化的内存地址,也就是指向该内存的指针
    //value:想要以什么值进行初始化
    //size:想要初始化的内存大小(字节大小)
    
    • 1
    • 2
    • 3
    • 4

    由于memset()函数是以字节为单位进行内存初始化的,所以memset(p,0,nsizeof(int))可以将所开辟的内存的每个字节初始化为0。
    在这里插入图片描述
    所以使用memset(p,1,n
    sizeof(int))并不是将一个单元格中的数据初始化为1,而是将每个字节初始化为1。

    memset(p,1,n*sizeof(int));
    
    • 1

    在这里插入图片描述

    申请内存calloc()在初始化内存时,将分好的各个单元格初始化为对应数据类型的默认值

    //类型* 指针名 = (单元格解析大小 *)calloc(单元格数目,单元格大小);
    int* p = (int*)calloc(n , sizeof(int));
    double* p = (double*)calloc(n , sizeof(double));
    
    • 1
    • 2
    • 3

    申请扩容realloc()

    //类型* 指针名 = (解析单元格大小*)realloc(要扩容的内存地址(指针名),扩容内存的目标总字节大小);
    int* q = (int*)realloc(p,10*sizeof(int));
    
    • 1
    • 2

    示例

    //类型* 指针名 = (解析单元格大小*)realloc(要扩容的内存地址(指针名),扩容内存的目标总字节大小);
    //原先内存为5*4=20字节,现在扩容到10*4=40字节。
    p = (int*)realloc(p, 10*sizeof(int));// 方法(1)  //error
    if(p==NULL) exit(1);                
    int *q = (int*)realloc(p, 10*sizeof(int));//方法(2) //right
    if(q==NULL) exit(1);               
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    释放内存free()

    //free(指向要释放的内存的起始地址地指针);
    int n = 5;
    int* p = (int*)malloc(n *sizeof(int));
    free(p);//p存放的就是所开辟内存的起始地址
    p = NULL;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    本文借鉴于

  • 相关阅读:
    51单片机中断和定时的结合应用
    机器学习之深度学习简介
    最最新Netty线程模型源码,它真的太细了【doge】一
    阿里云盘搜索引擎项目架构图
    c++如何创建项目
    函数对象类,函数对象(又称仿函数)
    Redis实战案例及问题分析之-附近商铺(GEO数据结构)-用户签到(BitMap)-UV统计(HyperLogLog)
    DeepSpeed教程
    Mysql中常见的锁
    Linux安装Keepalived
  • 原文地址:https://blog.csdn.net/weixin_47681530/article/details/126911092