初识C语言==>野指针是什么?指针在什么情况下会出错?


什么是野指针?

概念︰野指针就是指针指向的位置是不可知的(如:随机的、不正确的、没有明确限制的)

说人话就是:野指针是错误的指针引用形式,通常有以下四种情况

  1. 指针未初始化
  2. 越界访问
  3. 指针指向的空间已释放

1.指针未初始化

这个概念非常容易理解,同变量一样,指针同样需要我们的初始化

//初始化指针
int a = 10;
int*p = &a;

指针未初始化 通常是以下情况

int main()
{
	int*p;
	*p=20;
}

这里的指针并没有指向某个内存地址,即便我们更改它的内容也是无效的

指针会默认赋予一个随机值,属于非法访问内存

当然,编译器遇到这种情况会直接报错

image-20210916212433314

2.越界访问

越界访问的情况通常出现在数组中

int arr[10]={1,2,3,4,5};
int* p=arr;

我们知道,数组名代表是首元素的地址

我们可以利用 for循环和指针++ 的方式,使指针访问数组中的每个元素

int main()
{
	int arr[5]={1,2,3,4,5};
	int* p = arr;
    int i =0;
    for(i=0;i<=5;i++)
    {
        *p=0;
        p++;
    }
}

我们知道,数组中的元素访问都是通过下标的方式。5个元素的数组,下标是从0-4

而在此代码中,p++第五次的时候,下标已经变成了5,对应的是第六个元素

但数组中并没有第六个元素,此时指针访问的就是一个空的地址了

同样属于非法访问

这就是越界访问的一种

3.指针指向的空间已释放

每当我们定义一个变量时,系统都会赋予这个变量一个内存的地址空间

这时候我们把这个地址赋予给指针p,指针便记录下了这个地址

用图来给大家演示一下什么叫指向的空间已释放

image-20210916213548912

代码示例如下

int* test()
{
	int a = 10;
	return &a;
}

int main()
{
	int* p = test();
	*p = 20;
	return 0;
}

image-20210916214004377


如何避免野指针?

1.指针初始化

在使用指针的时候,我们要像创建变量一样初始化指针

如果不知道把指针初始化为什么,那就赋值为NULL(代表0)

    1 int main()
    2 {
    3     //当前不知道p初始化为什么的时候
    4     //直接初始化为NULL(空指针-->0)
    5     int* p = NULL;
    6     //明确知道初始化的值
    7     int a = 10;
    8     int* ptr = &a;
    9     
   10     return 0;
   11 }

2.小心指针越界

在使用指针的时候,我们要注意不能让指针越界

如遇到数组的情况,一定要注意下标和元素个数的区别

  • 注意:C语言本身是不会检查数据的越界行为的!

3.指针指向空间释放就置之为NULL

在我们指针使用完毕之后,为了避免指针指向的空间被系统释放

我们可以将指针初始化为空指针,NULL

4.指针使用之前检查有效性

什么是有效性?

NULL的空指针就是无效的

为了避免我们引用这种无效的空指针,我们可以在使用指针之前用if语句判断一下它是否为空

if(p!=NULL)
	*p=10;

判断为有效指针,我们再使用它

做到以上4点,就能基本避免我们的代码出错。这只能避免,并不能杜绝

“你永远叫不醒一个想写bug的人”


结语

以上就是野指针的基本解释,希望对你有帮助

点个赞再走吧!万分感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值