动态内存分配

头文件

#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;
}

常见问题

```c
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;

}