[DSP编程]

C语言-野指针

[复制链接]
433|2
手机看帖
扫描二维码
随时随地手机跟帖
蒋博1026|  楼主 | 2019-10-22 15:57 | 显示全部楼层 |阅读模式
野指针问题

1、什么是野指针?哪里来的?有什么危害?

(1)、野指针,就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)

(2)、野指针的存在很大可能会触发运行时出现段错误(Sgmentation fault)

(3)、因为野指针在定义时如果未初始化,值也是随机的。指针变量的值其实就是别的

       变量(指针所指向的那个变量)的地址,这就意味着这个指针指向了一个地址是

    不确定的变量,这个时候如果去解引用的话,就是去访问这个地址不确定的变量,

    所以结果是不可知的。

(4)、野指针因为指向地址是不可预知的,所以有3种情况:

    第一种:指向不可访问的地址,触发段错误

    第二种:指向一个可用的、而且没什么特别意义的空间;这种程序运行不会出错,

            也不会对当前程序造成损害,其实是有问题的。

    第三种:指向一个可用的空间,而且这个空间其实在程序中正在被使用(譬如说某个变量a),

    那么野指针的解引用就会刚好修改这个变量的a的值,导致这个变量莫名其妙的被改变,

    程序出现离奇的错误。一般最终都会导致程序崩溃,或者是数据被损害。这种危害是最大的。

2、怎么避免野指针?

(1)、野指针的错误来源就是指针定义了以后没有初始化,也没有赋值(总之就是指针没有明确的指向

       一个可用的地址空间),然后去解引用。

(2)、常规的做法:

第一步:定时指针时,同时初始化为NULL

第二步:在指针解引用之前,先去判断这个指针是不是NULL

第三步:指针使用完之后,将其赋值为NULL

int main(void)

{

  int a;

  int *p = NULL;

  //省略若干行代码

  p = &a;//正确使用指针的方式,是解引用指针之前跟一个绝对可用的地址绑定

  if(NULL != p)

  {

   *p = 4;

  }

  p = NULL;//使用完之后,记得将其重新赋值为NULL  

}

3、NULL到底是什么?

(1)、NULL在c/c++中定义为:

#ifdef  _cplusplus           //定义这个符号就表示当前环境是C++环境

#define NULL 0               //在C++中NULL就是0

#else

#define NULL (void *) 0      //在C中NULL是强制类型转换为void * 的 0

#endif

(2)、在C语言中,int *p; p = (int *)0;这是可以的;但是p = 0;这是不可以的,因为类型不相同,p是int *;0是int;

(3)、所以NULL的实质就是0,然后我们给指针赋初值为NULL,其实就是让指针指向0地址处。为什么这么做:

       原因1:0作为一个特殊地址(我们认为指针指向这里就表示没有被初始化,就表示野指针)

    原因2:地址0在一般的操作系统中都是不可以被访问的,如果程序不检查是否等于NULL就去解引用就会触发段错误。

使用特权

评论回复

相关帖子

zeshoufx| | 2019-10-22 21:28 | 显示全部楼层
谢谢分享,,,,,,,,,,,,,,

使用特权

评论回复
蒋博1026|  楼主 | 2019-10-24 08:44 | 显示全部楼层
zeshoufx 发表于 2019-10-22 21:28
谢谢分享,,,,,,,,,,,,,,

我是发现好多基础都没理解到位,才开始恶补的,从基础开始补

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1827

帖子

18

粉丝