在C语言项目中,经常会遇到需要程序员手动分配内存的地方。这样做能够节省大量的内存空间,也让程序更加灵活。只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合。这个组合使用起来有一个需要注意的地方,不知道你有没有发现。

野指针是什么?

根据百度百科的说法,野指针是指 指向一个已删除的对象或未申请访问受限内存区域的指针.

我这里是这样理解的,野指针就是指向的内存区域不合法,这里的不合法主要包括以下几个方面:

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

野指针和free总结超有用的资料的更多相关文章

  1. QPointer很大程度上避免了野指针(使用if语句判断即可,类似于dynamic_cast),而且使用非常方便 good

    QPointer 如何翻译呢?我不太清楚,保留英文吧. The QPointer class is a template class that provides guarded pointers    ...

  2. linux kernel elv_queue_empty野指针访问内核故障定位与解决

    1. 故障描述 故障操作步骤: 单板上插了一个U盘,出问题前正在通过FTP往单板上拷贝文件,拷贝的过程中单板自动重启. 故障现象: Entering kdb (current=0xc000000594 ...

  3. iOS为真机调试增加scribble来定位野指针

    尽管在ARC中,野指针出现的频率已经大大降低了,但是仍然会有野指针困扰着我们. 在模拟器调试中,我们可以开启scribble或者zombieObject来将已经释放的内存填充无意义的内容,能够将一些非 ...

  4. C++内存泄露之野指针

    写出本文仅仅是处于备忘的目的. 最近为现在做的软件添加了一个内存回收机制(以前处于某种内存只申请不释放,这并不等于内存泄露,因为我们知道这些内存块在内存中的位置)-- 在某一块内存不使用的时候将其释放 ...

  5. iOS开发_内存泄漏、内存溢出和野指针之间的区别

    今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自 ...

  6. NULL指针、零指针、野指针

    1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成 ...

  7. Xcode 7 调试野指针利器 Address sanitizer

    Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error dete ...

  8. 黑马程序员-nil Nil NULL NSNull 野指针和空指针

    空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...

  9. C中的野指针—如何避免

    转自:http://www.cnblogs.com/viviwind/archive/2012/08/14/2638810.html 先看一个例子: struct student{ char* nam ...

随机推荐

  1. ysoserial CommonsColletions3分析(1)

    CC3的利用链在JDK8u71版本以后是无法使用的,具体还是由于AnnotationInvocationHandler的readobject进行了改写. 而CC3目前有两条主流的利用链,利用Trans ...

  2. Sonarqube C# 配置资料整理

    c#配置方式: http://www.cnblogs.com/CoderAyu/p/9416376.html http://www.cnblogs.com/jingridong/p/6513884.h ...

  3. project read error(项目读取错误)

    maven的pom文件出现project read error 1,打开电脑cmd操作界面,在cmd界面找到打开出错项目的文件夹; 比如我的项目文件夹在D:\>eclipse-jee-file\ ...

  4. 【OI】WERTYU UVa 10082

    题目: A common typing error is to place the hands on the keyboard one row to the right of the correct ...

  5. PHP的Sodium加密扩展函数了解

    这是本次加密扩展系列的最后一篇文章,也是我们要学习了解的最后一个 PHP 加密扩展.Sodium 出现的目的也是为了代替 Mcrypt 这个原来的加密扩展.在 PHP7.2 之后,Mcrypt 已经被 ...

  6. PHP设计模式之中介者模式

    上回说道,我们在外打工的经常会和一类人有很深的接触,那就是房产中介.大学毕业后马上就能在喜欢的城市买到房子的X二代不在我们的考虑范围内哈.既然需要长期的租房,那么因为工作或者生活的变动,不可避免的一两 ...

  7. Nginx TP5环境配置

    Apache默认支持Pathinfo模式  Nginx不支持  需要手动配置  Apache默认支持Pathinfo模式  Nginx不支持  需要手动配置 server { #配置监听端口 list ...

  8. PHP 流行的框架

    Aura Laravel Symphony Yii Zend php components Packagist 最好的组件: Awesome PHP https://www.yiiframework. ...

  9. 51nod1355-斐波那契的最小公倍数【min-max容斥】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...

  10. IdentityServer4[3]:使用客户端认证控制API访问(客户端授权模式)

    使用客户端认证控制API访问(客户端授权模式) 场景描述 使用IdentityServer保护API的最基本场景. 我们定义一个API和要访问API的客户端.客户端从IdentityServer请求A ...