作业
1. 什么是野指针,如何避免
定义:随机指向一块内存的指针
原因:局部指针变量位于栈空间,栈空间未初始化的变量随机赋值,栈空间由系统管理,指针未申请即获得了一个地址,如果此地址已分配,则可能通过运行,如果没有用过,则会造成内存泄漏
野指针造成的错误:内存泄漏(段错误的一种)(没有向系统申请就获得了地址,造成内存泄漏)
如何避免:养成以下良好的编码习惯
1.初始化为NULL (NULL其实是#define NULL (void *))
NULL在操作系统为0,0地址不允许存放值或对其做操作
作用:1)当int *p=NULL;后,开发者知道不可再对p赋值
2)NULL大写可以提醒开发者这是一个野指针(C语言关键字大写基本都是为了提醒,编码规范#define(宏定义)一定要大写也是这个原因)
2.当要往一个指针指向空间赋值时,一定要检查这个指针是否已经分配空间(没有则先分配再赋值)
3.malloc函数分配:形参是分配字节数,返回分配空间的首地址(void*)
返回空间是堆空间,失败返回NULL(也就是下面判断是否成功的方法)
函数原型:int *p=malloc(sizeof(int));
由于int大小取决于操作系统,为了提高移植性,
建议形参为sizeof(int);
注意:由于可能库函数malloc可能已经被多次调用,存在其他程序残留返回值没有释放,也就存在分配失败的可能,所以需要检查是否分配内存成功
判断分配是否成功:
if(p==NULL)
{ printf(“mallocerror!\n”);
exit(1); //直接退出程序
}
4.使用前对分配的空间初始化
memset(p,0,sizeof(int)) //使p指向一串初始地址0
5.使用完释放
free(p);
6.再次置空 //避免再次成为野指针
p=NULL;