C99 calloc、malloc和realloc区别

2018-01-26  创建人:Ruo_Xiao
参考文档:C99标准
邮箱:xclsoftware@163.com

一、共同点

  1. 均来自头文件:stdlib.h
  2. 分配的内存都是连续的。
  3. 返回值为void *,C/C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。
  4. 若成功,则返回内存对齐的指针;若失败,则返回NULL。
  5. 均有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,无操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值