【C 语言】指针 Five 之 ["⚔ 野指针,🗡 如何规避野指针,💣 指针的未初始化,💣指针越界访问"]
🚩write in front🚩
🔎Hello,大家好我是泽 En,一起共同学习,多多指教(●'◡'●)🔎
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🖊
📢2021 年度博客之星物联网与嵌入式开发 TOP5,2021 博客之星 Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]
⚔ 野指针
概念:野指针就是指针指向的位置是不可知的。
随机的。
不正确的。
没有明确的限制。
指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
指针越界也会导致野指针问题,这里解释下:就是当你指针指向的范围超过数组名范围时,那么那个指针就是野指针了。
🗡 如何规避野指针
指针的初始化,不光是指针也要初始化,其它的任何类型都需要初始化。
小心指针越界。
指针指向空间释放即使置 NULL。
指针使用之前检查有效性。
示例代码如下 ↓
在上述代码当中我们把指针变量 p 赋值给了空指针 NULL,但是这里我们又把 p 进行解引用操作改变成了 20,就相当于我们访问了 NULL 的地址。实际上 NULL 相当于是 0,如果我们要访问 0 的地址的话它是不属于我们用户当中的,并没有分配给我们用户,所以当我们把 20 数字放进去的话是不能放进去的属于是非法访问了!
运行结果如下↓
0x002A1002 处有未经处理的异常(在 ConsoleApplication1.exe 中): 0xC0000005: 写入位置 0x00000000 时发生访问冲突。
💣 指针的未初始化
如下代码所示↓
p 是一个局部的指针变量,局部变量不初始化的话,默认是为随机值的。而随机的值放在指针变量 p 里面,就会以为这里面上放的是一个随机值。而随机的值放在指针变量 p 里面上,p 就会以为这是一个随机值的地址。
解引用 *p,那么我就会当 p 里面是一块地址。然后进行访问这块空间,因为 p 里面的这个地址是随机的值,这个时候就是通过这块地址在内存中由那个地址中指向的一块空间。所以,那个地址指向空间可能不是你的。那么这个时候就会造成非法访问内存。
以上讲解,所以才会把这里的 指针变量 p 称之为野指针 。
以上指针变量的初始化√
指针常见错误 。
引用未初始化的指针变量 。
试图引用未初始化的指针变量是初学者最容易犯的错误。未初始化的指针变量就是"野"指针,它指向的是无效的地址 。
有些书上说:"如果指针变量不初始化,那么它可能指向内存中的任何一个存储单元,这样就会很危险。如果正好指向存储着重要数据的内存单元,而且又不小心向这个内存单元中写入了数据,把原来的重要数据给覆盖了,这样就会导致系统崩溃",这种说法是不正确的!如果真是这样的话就是编译器的一个严重的 BUG (o゚v゚)ノ
所以,指针虽好但你也得会用 。 不然你的 BUG 就会满天飞 。
💣 指针越界访问
代码如下↓
指针变量越界数组导致野指针问题 。
注意→C 语言是不会本身检测数组的越界行为的。
版权声明: 本文为 InfoQ 作者【泽En】的原创文章。
原文链接:【http://xie.infoq.cn/article/efd104a5f40674aea2eae5635】。文章转载请联系作者。
评论