一、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次调用时,内存不足了,就出现内存溢出。

malloc的内存申请和释放相关推荐

  1. fork练习、从进程角度考虑堆区内存申请与释放的有关问题

    1.fork练习 1.1代码1; int main( int argc, char* argv[], char* envp[]) {int i = 0;for( ; i < 2; i++ ){f ...

  2. C/C++动态内存申请与释放

    20.1 理解指针的两种"改变" 普通变量(非指针,简单类 型变量)只能改变值:   1) int a = 100; 2) ... 3) a = 200;   第 1 行代码,声明 ...

  3. C/C++内存申请和释放(一)

    这一篇主要介绍一下C中的malloc和free(当然在C++中它们也可以使用),下一篇将主要介绍一下C++中的new和delete 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 0. mallo ...

  4. sk_buff整理笔记(三、内存申请和释放)

    承接上一篇blog--sk_buff整理笔记(二.操作函数),这篇是要来讲解下sk_buff结构的内存申请和释放函数.因为sk_buff结构是比较复杂的(并不是其本身结构复杂,而是其所指的数据区以及分 ...

  5. [转]malloc的内存用free释放后为何系统回收不了

    在学习第七章7.8节时关于存储器分配这一块的时候,有个疑问,malloc(当然包括calloc和realloc)申请内存时候是怎么样申请的,free的时候内存是直接还给操作系统么?这个也是我在阿里面试 ...

  6. 内存申请与释放(转)

    释放内存?那要看你怎么申请的了 new->delete;malloc->free;GlobalAlloc->GlobalFree;VirtualAlloc(Ex)->Virtu ...

  7. 【C】malloc动态分配内存和free释放

    先看一个例子 #include<stdio.h> int max=10; //data区,不产生具体的可执行代码. void main() {//局部变量都在栈区. 栈内存自动分配,释放. ...

  8. 结构体变量内存申请与释放

    目录 1.前言 2.常见结构类型 3.Demo 4.结束 1.前言 结构体是C.C++开发中不可或缺的数据结构,往往涉及到函数的入参以及出参等,也必然涉及到参数的初始化.对于字符串往往是需要在堆上开辟 ...

  9. C++之内存管理:申请与释放

    目录 前言 1.C/C++内存分布 1.1虚拟内存分段 1.2理解一些概念 1.2.1栈帧向下增长 1.2.2堆向上生长 1.2.3栈和堆会碰撞吗? 1.2.4关于const的说明 2.C语言中动态内 ...

最新文章

  1. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )
  2. python爬虫的技能_python-爬虫技能升级记录
  3. CodeForces - 1450C2 Errich-Tac-Toe (Hard Version)(思维+构造)
  4. mysql 数据库名称限制_mysql 数据库名称限制
  5. Redis 持久化方式
  6. Thinkphp5 请求报错
  7. 3.2. 添加模板版本(Core Data 应用程序实践指南)
  8. PyTorch 成程序员“新宠”,TensorFlow 风光不再?
  9. CCNA学习要点,希望能对初学者有帮助
  10. python调用nmap扫描全端口_python nmap实现端口扫描器教程
  11. 【STM32F407开发板用户手册】第2章 STM32F407的开发环境搭建
  12. 小米8屏幕指纹版(UD) 稳定版miui11刷magisk、太极参考
  13. Google Gson用法详解
  14. dw怎么在框架中加入网页_Dreamweaver如何用框架建立网站
  15. Django:发送邮件
  16. Java版俄罗斯方块
  17. 大数据干货,1个案例讲清楚精准营销!
  18. ThingsBoard 规则引擎-邮件通知
  19. 战略项目——科龙空调中高层干部培训记
  20. 大数据服务平台---接口自动化

热门文章

  1. Arduino电位器控制
  2. python人脸识别门禁_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(二)
  3. 单位根检验、协整检验和格兰杰因果检验三者之间的关系
  4. 计算机动漫学的什么软件,电脑动漫绘画哪个软件比较好?
  5. 「实验性讲稿」载谭 Binomial Sums 详解
  6. Linux-搭建web服务器
  7. 微博爬虫及舆情分析-1.爬取微博数据
  8. bukgu 杂项 图穷匕见
  9. 液晶面板里面有些什么配件_液晶显示器参数和部件详细介绍
  10. 微信小程序开发入门教程(十二)