欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

C99 calloc、malloc和realloc区别

发布时间:2024/10/14 编程问答 68 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C99 calloc、malloc和realloc区别 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
2018-01-26 创建人:Ruo_Xiao 参考文档:C99标准 邮箱:xclsoftware@163.com

一、共同点

  • 均来自头文件:stdlib.h
  • 分配的内存都是连续的。
  • 返回值为void *,C/C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。
  • 若成功,则返回内存对齐的指针;若失败,则返回NULL。
  • 均有free释放。
  • 二、calloc

    1、原型:

    void *calloc(size_t nmemb, size_t size);

    2、功能描述
    calloc函数申请一个元素个数为nmemb的内存块,每一个元素大小为size,每个元素自动初始化为0。
    3、栗子:

    char *pStr = NULL;/*分配内存空间*/pStr = (char*)calloc(10,sizeof(char));

    结果如下:

    查看内存:

    大家可以发现,该地址后面10个字节均是0,而第11、12、13和14个字节均是未定义,故calloc连续分配了10个字节的内存并自动清零。

    三、malloc

    1、全称:memory allocation,中文叫动态内存分配。
    2、原型:

    void *malloc(size_t size);

    3、功能描述
    malloc 申请指定size大小的内存块,其值不会初始化。
    4、栗子:

    int *pi = NULL;/*分配内存空间*/pi = (int*)malloc(10*sizeof(int));

    结果:

    查看内存:

    大家可以发现,该地址后面40个字节均是cd,而第41、42、43个字节均是未定义,故malloc连续分配了40个字节的内存但没有初始化。

    四、realloc

    1、原型

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

    2、功能描述
    (1)释放原来的内存空间,若原地址后面有足够的内存,则在同一地址下申请size大小的新内存块。若没有,则在新的内存地址下申请内存。
    (2)若size小于原来的内存大小,则原数据末尾部分丢失。若size大于原来的内存大小,则原数据完整拷贝到新的内存块,多出来的内存块不初始化。
    栗子:

    int *pi1 = NULL;int *pi2 = NULL;pi1 = (int *)malloc(3*sizeof(int));pi1[0] = 1;pi1[1] = 2;pi1[2] = 3;pi2 = (int *)realloc(pi1,4*sizeof(int));

    结果:

    查看内存:

    修改代码如下:

    pi2 = (int *)realloc(pi1,2*sizeof(int));

    结果:

    查看内存:

    (3)若ptr为NULL,size非零,则realloc会申请一个新的内存块,大小为size,等同于malloc。
    栗子:

    int *pi2 = NULL;pi2 = (int *)realloc(NULL,2*sizeof(int));

    结果:

    查看内存:

    (4)若ptr有值,但size为0时,则释放内存,返回NULL,等同于free。
    栗子:

    int *pi1 = NULL;int *pi2 = NULL;pi1 = (int *)malloc(3*sizeof(int));pi1[0] = 1;pi1[1] = 2;pi1[2] = 3;pi2 = (int *)realloc(pi1,NULL);

    结果:

    五、free

    1、头文件:stdlib.h
    2、原型:

    void free(void *ptr);

    3、功能描述:
    释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。
    4、使用后该指针变量一定要重新指向NULL,防止野指针出现,有效 规避误操作。
    5、若形参为NULL,无操作。

    总结

    以上是生活随笔为你收集整理的C99 calloc、malloc和realloc区别的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。