野指针

//一个造成“野指针”的典型例子
unsigned char *Functions(void)
{
 unsigned char Number = 0; //函数内的局部变量
 unsigned char *p = &(Number); //指向该局部变量的指针
 ……
 return p; //一个野指针诞生了
}
很多原因都可以造成“野指针”,对于初学者来说,如果试图采
用背公式的方法记录下所有可能造成野指针的代码形式,那么这种尝
试往往是徒劳的,因为能记住的代码形式是有限的,而造成野指针的
可能性是无穷尽的——“一个野指针倒下了,千百个野指针站起来
了”。 只有在编写代码时,仔细考察“指针的有效范围”以及“指针
所指向变量的有效范围”避免指针范围超越变量生存范围的情况出
现,才能从根本上降低“野指针”存在的可能
上面的函数例子中,由于指针被作为函数的返回值,因此该指
针的有效范围不仅仅局限于函数体内部;而指针所指向的变量是一个

局部变量,其有效范围仅限于函数执行期间的函数体内部,一旦函数
执行结束,变量本身就被释放。在这种情况下,指针的有效范围大于
其指向变量的有效范围,因而,导致了一个野指针的诞生。
不可否认,上面关于野指针的例子来源于 C 语言学习的经典,
让人觉得仿佛野指针只有在这种非常罕见或者类似的情况下才会发
生。实际应用中,情况要更糟。下面就是一个更为典型的例子,有理
由相信,在指针学习中,没有任何一个错误比它还要“流行”:

int *p;
int a;
……
a = 100;
(*p) = a;
如果您一眼就看出了错误的所在并正准备捧腹大笑,我们还是
希望有机会给那些仍然一脸迷惑的朋友们作一个明确的解释:上面的
程序片断中,指针 p 并没有得到初始化(也就是说,指针没有指向实
体),它的值可以是任意的(好心的编译器有时候会自作聪明将其置
NULL),换句话说是它就是一个野指针。对一个野指针进行任何访
问操作都是极其危险的。通常,程序在编译的时候我们并不会看见到
任何警告,一旦程序得到运行, “ XX 地址不可访问”的错误提示往往
令我们无所适从。
对于这种错误,检查起来非常简单,记住一个原则: 指针必须
要指向实体——无论你是在初始化的时候给予, 还是后来某个时刻给
予——实体和指针的初始化一样都是必不可少的。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值