写点什么

【C 语言】指针 Five 之 ["⚔ 野指针,🗡 如何规避野指针,💣 指针的未初始化,💣指针越界访问"]

作者:泽En
  • 2022 年 5 月 21 日
  • 本文字数:1497 字

    阅读完需:约 5 分钟

【C 语言】指针 Five 之 ["⚔ 野指针,🗡 如何规避野指针,💣 指针的未初始化,💣指针越界访问"]

​​​🚩write in front🚩

🔎​​Hello,大家好我是泽 En,一起共同学习,多多指教(●'◡'●)🔎

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🖊

📢2021 年度博客之星物联网与嵌入式开发 TOP5,2021 博客之星 Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

⚔ 野指针

概念:野指针就是指针指向的位置是不可知的。

  1. 随机的

  2. 不正确的

  3. 没有明确的限制

指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。

指针越界也会导致野指针问题,这里解释下:就是当你指针指向的范围超过数组名范围时,那么那个指针就是野指针了。



🗡 如何规避野指针

指针的初始化,不光是指针也要初始化,其它的任何类型都需要初始化。

小心指针越界。

指针指向空间释放即使置 NULL。

指针使用之前检查有效性。

示例代码如下 ↓


#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(void){  int *p = NULL;  *p = 20;  return 0;}
复制代码


在上述代码当中我们把指针变量 p 赋值给了空指针 NULL,但是这里我们又把 p 进行解引用操作改变成了 20,就相当于我们访问了 NULL 的地址。实际上 NULL 相当于是 0,如果我们要访问 0 的地址的话它是不属于我们用户当中的,并没有分配给我们用户,所以当我们把 20 数字放进去的话是不能放进去的属于是非法访问了!


运行结果如下↓

0x002A1002 处有未经处理的异常(在 ConsoleApplication1.exe 中):  0xC0000005:  写入位置 0x00000000 时发生访问冲突。



💣 指针的未初始化

如下代码所示↓


int* p;*p = 10;
复制代码


p 是一个局部的指针变量,局部变量不初始化的话,默认是为随机值的。而随机的值放在指针变量 p 里面,就会以为这里面上放的是一个随机值。而随机的值放在指针变量 p 里面上,p 就会以为这是一个随机值的地址。

解引用 *p,那么我就会当 p 里面是一块地址。然后进行访问这块空间,因为 p 里面的这个地址是随机的值,这个时候就是通过这块地址在内存中由那个地址中指向的一块空间。所以,那个地址指向空间可能不是你的。那么这个时候就会造成非法访问内存。

以上讲解,所以才会把这里的 指针变量 p 称之为野指针


int a = 10;       int* pa = &a;    
复制代码


以上指针变量的初始化√


指针常见错误

引用未初始化的指针变量

试图引用未初始化的指针变量是初学者最容易犯的错误。未初始化的指针变量就是"野"指针,它指向的是无效的地址

有些书上说:"如果指针变量不初始化,那么它可能指向内存中的任何一个存储单元,这样就会很危险。如果正好指向存储着重要数据的内存单元,而且又不小心向这个内存单元中写入了数据,把原来的重要数据给覆盖了,这样就会导致系统崩溃",这种说法是不正确的!如果真是这样的话就是编译器的一个严重的 BUG (o゚v゚)ノ

  • 所以,指针虽好但你也得会用 不然你的 BUG 就会满天飞


💣 指针越界访问

代码如下↓


#include<stdio.h>
int main(void){ int arr[10] = { 0 }; int i = 0; int* p = arr; //接收arr数组首元素的地址。 for (i = 0; i <= 12; i++) //当i=10的时候已经是非法访问内存了,因为,我数组名的常量表达式内容只有10个元素。 { *p = i; //i每次循环赋值给指针p p++; //指针自增+1,代指arr元素+1
//*p++ = i 也是可以,这里虽说++优先级更高,但是它是后置运算符。 } return 0;}
复制代码


指针变量越界数组导致野指针问题

注意→C 语言是不会本身检测数组的越界行为的。


发布于: 刚刚阅读数: 6
用户头像

泽En

关注

一起happy! 2022.01.29 加入

谁也不知道旅途的终点是怎么样的,现在只不过是开始。便全力以赴!终点必将是星辰大海。 2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

评论

发布
暂无评论
【C 语言】指针 Four 之 ["⚔ 野指针,🗡 如何规避野指针,💣 指针的未初始化,💣指针越界访问"]_C语言_泽En_InfoQ写作社区