malloc函数 & free函数 & 内存泄漏 & 野指针
malloc函数
malloc函数原型
void *malloc(unsigned int size)
malloc头文件
#include<stdlib.h>
返回值
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
malloc函数作用
malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址
如何定义
指针自身 = (指针类型)malloc(sizeof(指针类型)*数据数量)
int n;
int* p=NULL;
p=(int *)malloc(n*sizeof(int))
malloc函数的应用
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i;
int* parray=(int *)malloc(n*sizeof(int));
printf("请输入学生个数:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入第%d学生成绩:\n",i+1);
scanf("%d",parray++);
}
for(i=0;i<n;i++)
{
parray--;
}
for(i=0;i<n;i++)
{
printf("请输入第%d学生成绩是%d\n",i+1,*parray++);
// parray++;
}
free(parray); //用free函数释放空间
parray=NULL; //注意要让 p=NULL,不要让p变为野指针
return 0;
}
运行结果:
内存泄漏
内存泄漏的现象
程序刚运行起来是正常的,但是跑几个小时,或者几天,甚至几个月程序崩溃了。
内存泄漏的原因
可能是用malloc申请的内存空间没有及时释放,但是系统又不会主动释放,内存泄漏会减少可用内存的数量,从而降低计算机的性能,如果分配太多的可用内存,应用程序会瘫痪,或者系统速度变慢。
在Linux中,程序结束后,系统会自动回收空间。
如何避免内存泄漏
-
注意循环中有没有一直申请内存空间。
-
要及时合理释放内存空间。
free(parray); //用free函数释放空间
parray=NULL; //注意要让 p=NULL,不要让p变为野指针
野指针
什么是野指针?
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
简单来说就是定义的指针变量没有初始化或者指针没有指向就是野指针。
比如:
int* p;
此时的p就是一个野指针,因为不知道它的具体指向。
如何避免野指针
在养成这些习惯的情况下,野指针的危害是可以降低的:
初始化时置 NULL
指针变量一定要初始化为NULL,因为任何指针变量(除了static修饰的指针变量)刚被创建时不会自动成为NULL指针,它的缺省值是随机的。
比如:
int* p=NULL;
释放时置 NULL
当指针p指向的内存空间释放时,没有设置指针p的值为NULL。free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。
例如:
free(parray); //用free函数释放空间
parray=NULL; //注意要让 p=NULL,不要让p变为野指针