C语言中的动态内存管理

code:

#include<iostream> 
#include<stdlib.h>
#include<string.h>
using namespace std;
/*
1 malloc:分配得到的内存空间是未初始化的,因此一般在使用该内存空间时,要调用另一个函数memset来将其初始化为全0
2 calloc:会将所有的元素初始化为 0
3 realloc:改变已经被分配给一个指针的内存的长度 
4 free:函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时,指针为野指针,
如果此时操作该指针会导致不可预期的错误。安全做法是:在使用free()函数释放指针指向的空间之后,将指针的值置为NULL。
*/ 

void myprint(int *p,int n){
    for(int i=0;i<n;i++){
        cout<<p[i]<<endl;
    }
}

void myprint(float *p,int n){
    for(int i=0;i<n;i++){
        cout<<p[i]<<endl;
    }
}

int main()
{
    //1 malloc 
    int *p = (int*)malloc(5*sizeof(int)) ;
    if (NULL == p)
    {
        printf("Error in malloc.\n");
        return -1;
    }
    cout<<"malloc:"<<endl;
    myprint(p,5);
    //使用memset函数来初始化malloc函数分配的空间
    memset(p,0,5*sizeof(int));
    cout<<"init by memset:"<<endl;
    myprint(p,5);
    
    //2 calloc
    float *p2 = (float*)calloc(5,sizeof(float));
    if (NULL == p2)
    {
        printf("Error in calloc.\n");
        return -1;
    }
    cout<<"calloc:"<<endl;
    myprint(p2,5);
    
    //3 realloc
    int *p3 =(int*)malloc(sizeof(int));
    /*
    void * realloc(void * p, size_t n);
    其中,指针p必须为指向堆内存空间的指针,
    即由malloc()函数、calloc()函数或realloc()函数分配空间的指针;
    realloc()函数分配的空间也是未初始化的。
    */ 
    int *p4 =(int*)realloc(p3,5*sizeof(int));
    //realloc操作可能失败(return NULL), 所以需要先检验,再将其赋值给目标指针 
    if(p4!=NULL)
    {
        p3=p4;
    }
    cout<<"realloc:"<<endl;
    myprint(p3,5);
    
    //释放空间,避免内存泄露
    {
        free(p);
        free(p2);
        free(p3);
        free(p4);
        p=NULL;
        p2=NULL;
        p3=NULL;
        p4=NULL;    
    }
    
    return 0;
}

运行结果:

部分内容参考网址:

https://www.cnblogs.com/52php/p/5794342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值