浏览 4385 次
锁定老帖子 主题:野指针和free总结
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2020-12-23
野指针是什么? 根据百度百科的说法,野指针是指 指向一个已删除的对象或未申请访问受限内存区域的指针. 我这里是这样理解的,野指针就是指向的内存区域不合法,这里的不合法主要包括以下几个方面: 1. 所指向的内存未申请 2.所指向的内存被释放 当你访问一个未申请的内存区域时,系统会判定我们没有权限,无法访问。内存被释放后你再访问,结果完全不可预知,很大几率会出现段错误(segmentation fault),这是提示你访问越界了。 野指针怎么出现的? 在代码中以下几种情况会出现野指针: 1.指针声明后未初始化 这种情况下编译器一般会给出一个 warning警告,自己要注意避免。 2.指针指向的空间被free后,没有被重置为NULL,或者指向一个有效的内存区域、 在free后要及时处理被free的指针,例如令其指向NULL。 野指针该如何避免? 1.在指针声明时,要养成将其初始化的习惯。如下: int *p = NULL; 默认将其初始化为NULL 2.在free后面,加上重置指针的代码,如下: free(p); p = NULL; 重置为NULL 为了便于理解,下面贴上一份代码: #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { char *p = NULL; //初始化为NULL p = (char *)malloc(100); if(p==NULL) { return 0; } strcpy(p,"12321323213"); //向内存拷贝值 printf("p : %s\n",p); //打印值 if(p!=NULL) { free(p); p = NULL; //在释放完后,再将指针的值置为空 } //free释放的是指针所指向的内存空间,而不是指针的值。 //所以释放后指针还是指向原来的地址 if(p1!=NULL) { free(p1); //如果再次释放,就会出现野指针错误。 } getchar(); return 0; } 参考学习资料 指针 http://www.makeru.com.cn/live/1392_238.html?s=45051 C语言控制led灯 http://www.makeru.com.cn/live/1392_304.html?s=45051 输入和输出 http://www.makeru.com.cn/live/1758_312.html?s=45051 C语言玩转链表 http://www.makeru.com.cn/live/1392_338.html?s=45051 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |