• malloc,calloc,realloc


    与堆操作相关的两个函数

    malloc

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main()
    {
        char *p = malloc(10);  //内存随机,未做处理
        
        int i;
        for(i = 0; i < 10: i++)
        {
            printf(“%d “,p[i]);
        }    
        free(p);
        return 0;
    }

    运行结果:(linux)

    exbot@ubuntu:~/wangqinghe/C/20190630$ ./malloc

    0 0 0 0 0 0 0 0 0 0

    全是0表示分配的这块内存没有用过。

    相同的代码在windows环境下运行必须将

    char *p = malloc(10);换成 char *p = (char*)malloc(10);

    因为malloc分配的地址是指向void*

    不更换过来会报 invalid conversion from ‘void*’ to ‘char*’ 的错误

    换过后的运行结果如下:

    可以在使用malloc之后使用memset函数来初始化该指针指向的地址大小为0或者-1.(memset)只能初始化这两种值。

    char *p = malloc(10);

    memset(p,0,10);     //初始化所有内存为0

    calloc

    calloc函数可以直接达成这样的效果:分配内存并且同时初始化为0

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main()
    {
        //char *p = malloc(10);
        char *p = (char*)calloc(10,sizeof(char));
        int i;
        for(i = 0; i < 10; i++)
        {
            printf("%d ",p[i]);
        }
        free(p);
        return 0;
    }

    realloc

    想要将两个分配的内存块在一起,可以使用realloc函数

    在原有内存基础之上,在堆中间增加连续的内存。

    如果原有内存没有连续内存可扩展,那么会重新分配一个空间,将原有的内存copy到新空间,然后释放。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main()
    {
        char *p1 = (char*)calloc(10,sizeof(char));
        char *p2 = (char*)realloc(p1,10);
        int i;
        for(i = 0; i < 20; i++)
        {
            printf("%d ",p2[i]);
        }
        free(p2);
        return 0;
    }

    在p1内存的基础上扩充,并且会自动初始化p1内存大小的内存为0;

    若p2内存分配大小大于p1,那么多出来的内存则会有随机值。

    char *p2 = (char*)realloc(NULL,10)  //等同于malloc;

    realloc和malloc只分配内存,不处理。

  • 相关阅读:
    echarts 算百分比与js toFixed算出来的百分比不一致的问题。
    VUE, Vue Router Tab 显示动态页签名称。
    [日常坑]前端j's数据导出excel,导出的文件损坏
    [最新 | Build 3211]Sublime Text 2.x, 3.x 许可License集合
    图片滤波
    electron-ipc通信性能分析
    设计vue3的请求实体工厂
    canvas-修改图片亮度
    canvas性能-drawImage渲染图片
    基于windows配置gitlab-runner
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11109453.html
Copyright © 2020-2023  润新知