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只分配内存,不处理。

转载于:https://www.cnblogs.com/wanghao-boke/p/11109453.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值