malloc的内存申请和释放

一、malloc

malloc是个库函数,使用时要包含<stdlib.h>这个头文件 

 malloc向内存申请空间时需要我们指定所需内存的大小,并且申请成功时,返回指向所申请的内存空间的指针(该指针为void指针类型);若内存中所剩余的空间小于我们所申请的空间,则申请失败,返回NULL。因返回的指针类型为void,所以需要我们其强制转换成指定类型的指针,如下:

int *p = NULL;
p =(int *)malloc(sizeof(int));

 具体使用时,可用来申请一段连续的空间,以存放多个数据(相当于数组)

#include<stdio.h>
#include<stdlib.h>
//the use of malloc fuction, 

void mallo1(void);
int main()
{
 
    int *p = NULL;
    int n;
    printf("input num n:>");
    scanf("%d",&n); //输入数组的大小
    p = (int *)malloc(n*sizeof(int)); //申请n个整形大小的空间
    if(p == NULL){
        printf("malloc error\n");    //失败时打印出失败信息
        return -1;
    }                               
    printf("input nums what you want:\n");
    for(int i=0;i<n;i++)
    {
        scanf("%d",&p[i]);
    }

    for(int i=0;i<n;i++)
    {
        printf("%d ",p[i]);
    }
    printf("\n");
    free(p); //释放
    return 0;

这里程序退出时会自动释放申请的空间,所以不使用free函数释放,也不会有太大问题,但在大型的项目中可能会频繁的申请内存空间,或在自己定义的函数中申请内存空间,此时若不使用free释放,就会存在内存溢出的问题。如下

#include<stdio.h>
#include<stdlib.h>
//the use of malloc fuction, 

void mallo1(void);
int main()
{
   for(int i=0; i<1000000000;i++)
    {
        mallo1(); 
    }
    
    return 0;
}

//function
void mallo1(void)  //在函数内申请内存空间,不释放
{
    int *p = NULL;
    p =(int *)malloc(1000*sizeof(int));
    //free(p);先不釋放
}

运行结果显示已杀死,这就是因申请空间后没释放所申请的空间,重复太多次的申请后,导致内存空间不足,也就是内存溢出造成的。

 到这里相信对于什么不释放是内存溢出,我们还是不知所以然,网上对于内存溢出的解释有很多,但大多没涉及到重点,这里笔者从变量的生命周期和作用域分析为什么会存在内存溢出。

(1)全局变量和局部变量

先给代码块的概念:代码块就是在大括号“{}”之内的代码,如下:main函数的{}之内的代码是一段代码块,for循环的{}也是一段代码块。

int a;
int main()
{

    int c;
   for(int i=0; i<1000000000;i++)
    {
        mallo1(); 
    }
    
    return 0;
}

全局变量:定义代码块之外的变量,如 变量a

局部变量:定义在代码块之内的变量,如 变量 c(main之内) 和 i(for循环之内)

(2)变量的作用域

全局变量的作用域是这个工程,也就是变量 a 在整个程序的如何地方中都可以被使用,且一旦被修改就会一直保持。

局部变量的作用域是其所在的代码块之内,不能在代码块之外的地方使用,如 i 只能在for中使用,在for之外的地方使用会报“变量未定义”的错误。

(3)变量的生命周期

变量的生命周期是指变量从创建到销毁之间的一段时间。

全局变量的生命周期是:这个程序的生命周期,也就是整个程序执行完的时候结束。

局部变量的生命周期是:进入作用域时生命周期开始,出作用域时生命周期结束。


//function
void mallo1(void)  //在函数内申请内存空间,不释放
{
    int *p = NULL;
    p =(int *)malloc(1000*sizeof(int));
    //free(p);先不釋放
}

回到内存溢出的问题:在上面定义的mallo1函数中,变量 p 是局部变量,它的作用域只在mallo1函数内部,出了mallo1函数生命周期也就结束了(可以理解为mallo1函数以外的函数不知道有p的存在,但在mallo1函数内我们没有释放掉p,所以p所指向的内存空间一直被占用着)。

因此 p 在main函数中无法被使用,它所指向的内存空间也也无法被main函数所访问,所以我们没有办法在mallo1函数之外释放掉 p 所指向的内存空间,因而 p 从始至终都会指向一个内存空间,每调用一次mallo1函数就会有一个新的 p 指向一块新的内存空间,多次调用(如我们想调用10000次),然而在100调用后,就会有100个 p 指向各自的内存空间(注意:每个p都是独立的),此时系统剩下的内存已经不够下次mallo1申请的空间,到第101次调用时,内存不足了,就出现内存溢出。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值