概述
一、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的内存申请和释放所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复