【C语言】如何规避野指针|指针的未初始化

举报
謓泽 发表于 2023/09/28 20:51:50 2023/09/28
【摘要】 【C语言】如何规避野指针|指针的未初始化

🗡 如何规避野指针

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

小心指针越界。

指针指向空间释放即使置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就会满天飞
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。