动态内存分配


来源: 博客园

#动态内存分配##头文件```c#include#include#include#include#include`


【资料图】

动态内存分配

头文件

#include #include #include #include #include 

malloc

int main(){    //像内存申请10个整形的空间    int* p =(int*)malloc(10*sizeof(int));//malloc不初始化为零    if(p==NULL)    {        //打印错误的一个方式        printf("%s\n",strerror(errno));    }    else    {        //正常使用空间        int i = 0;        for(i=0;i<10;i++)        {            *(p+i)=i;        }        for(i=0;i<10;i++)        {            printf("%d ",*(p+i));        }    }    //当动态申请的空间不在用的时候,就应该还给操作系统    free(p);    p = NULL;    return 0;} 

calloc

int main(){    int* p=(int*)calloc(10,sizeof(int));//calloc初始化为零        if(p==NULL)    {        printf("%s\n",strerror(errno));    }    else    {        int i = 0;        for(i=0;i<10;i++)        {            printf("%d ",*(p+i));        }    }    free(p);    p = NULL;    return 0;} 

realloc

int main(){    int* p = (int*)malloc(20);    if(p==NULL)    {        printf("%s\n",strerror(errno));    }    else    {        int i = 0;        for(i=0;i<5;i++)        {            *(p+i) = i;        }    }    //就是在使用malloc开辟的20个字节空间    //假设这里,20个字节不能满足我们使用    //希望有40个字节的空间    //这里用realloc开辟    //realloc使用注意事项    //1.原有空间后有足够的空间,原空间数据不发生变化    //2.没有足够空间,在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新地址。    int* p2 = realloc(p,40);    int i = 0;    for(i=5;i<10;i++)    {        *(p+i) = i;    }    for(i=0;i<10;i++)    {        printf("%d ",*(p2+i));    }    free(p);    p = NULL;    return 0;}

常见问题

int mian(){    //1.对空指针进行解引用操作    int* p = (int*)malloc(40);    //万一malloc失败了,p被赋值为NULL    //*p = 0;//err        int i = 0;    for(i=0;i<10;i++)    {        *(p+i) = i;//err    }    free(p);     p = NULL;        //2.对动态开辟的内存的越界访问    int *p = (int*)malloc(5*sizeof(int));    if(p == NULL)    {        return 0;    }    else    {        int i = 0;        for(i=0;i<10;i++)        {            *(p+i) = i;        }    }    free(p);    p = NULL;        //3.对动态开辟内存的free    int a = 10;     int* p = &a;    *p = 20;    free(p);    p = NULL;    int *p = (int*)malloc(40);    if(p == NULL)    {        return 0;    }    // //使用    int *p2 = realloc(p,80);    if(p2 != NULL)    {        p = p2;    }    int *p = realloc(NULL,40);//malloc(40)    //4.使用free释放动态开辟内存的一部分    int *p = (int*)malloc(40);    if(p == NULL)    {        return 0;    }    int i = 0;    for(i=0;i<10;i++)    {        *p++ = i;    }    //回收空间    free(p);    p = NULL;    //5.对同一块动态内存的多次释放    int *p = (int*)malloc(40);    if(p == NULL)    {        return 0;    }    //使用    //释放    free(p);    p = NULL;//避免二次free    //...    free(p);    //6.动态开辟内存忘记释放(内存泄漏)    while(1)    {        malloc(1);    }    return 0;}

[责任编辑:]

最近更新

图片新闻