动态内存分配

动态内存分配

头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <windows.h>

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;
}
posted @ 2023-08-04 12:30  bumper  阅读(37)  评论(0)    收藏  举报