我是靠谱客的博主 野性大象,最近开发中收集的这篇文章主要介绍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 errorn");    //失败时打印出失败信息
        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次调用时,内存不足了,就出现内存溢出。

最后

以上就是野性大象为你收集整理的malloc的内存申请和释放的全部内容,希望文章能够帮你解决malloc的内存申请和释放所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部