C语言野指针问题

在这里插入图片描述
在这里插入图片描述

C语言野指针问题

在这里插入图片描述

基础概念:

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
我们可以通俗易懂的将野指针比喻成一只绑在路上树旁的狗狗(你不知道是谁家的,狗狗也不认识你),只要你不去接近主动招惹它,就没有事,故意去接近挑逗它,被咬就是活该了
在这里插入图片描述
在C语言中,我们野指针也是同样的道理,存在野指针时,只要你不出去解引用访问通常就没有事,但是当你对一个野指针进行解引用访问时,那就麻烦大咯!!!

成因:

对于我们初学者而言,野指针问题是我们学习的一大阻碍,尤其是在初学者在后面学习数据结构的时候,写单链表或者双链表这些,我们经常会忘记指针初始化和销毁指针将指针重置为0,久而久之,日积月累,我们的自信心丧失,紧接着编程学习就从入门到放弃了。不要灰心,跟着小黄同学一起学习编程一定不会让你从入门到入土的,小黄一定会让你从入门到入土的!!!哈哈
在这里插入图片描述
其实,造成我们野指针问题的成因,一般情况下也就是3个,要么是指针未初始化,要么是指针越界访问,要么是指针指向的空间释放。
接下来我就来手把手教你拿捏这些造成野指针的成因。
注:我只介绍前两个成因,关于第3个成因指针指向的空间释放造成的野指针问题,嘻嘻,我留个悬念,等到我后续C语言更新到动态内存开辟的章节以后,我会在顺路补充阐述第3个造成野指针的成因。

成因一:指针未初始化

举个例子:这个就好比我们去酒店住宿一样,野指针就好比我们不交钱,抢行闯入酒店的某个房间进行住宿,结果显而易见,后果严重地话酒店负责人可能会协同警察对你进行管制;而正常指针就相当于你在酒店正常交钱,然后酒店给你开个房间让你住宿,什么事都没有。
代码演示讲解:
在这里插入图片描述
以上述代码为例,结果显而易见,在我的VS2013的编译器下,代码运行都运行不起来!!!
在这里插入图片描述
我们可以清楚地看见编译器的报错,这就是我们所说的第一类野指针(指针未初始化造成的野指针)
在这里插入图片描述

成因二:指针越界访问

举个例子:这就好比你养鸡,你的鸡场鸡觅食的地方只有一小块地方,而且这一小块地方食物还那么地缺乏,而你隔壁老王的鸡场不仅大而且觅食的地方食物也充足,你的鸡不听话跑过去别人的地盘觅食,结果显而易见?你的鸡去别人家的地盘觅食是要付出代价的,鸡还是你的鸡吗?不,实际上已经在老王的锅里炖了,你还想上门说理?你只能哑巴吃黄连,有苦说不出了。
代码演示讲解:
在这里插入图片描述
在这里插入图片描述

如果上述代码所示,我们只开辟了6块空间,但是呢,你却想赋值到第7块空间,结果显而易见,编译器果断报错!!!
在这里插入图片描述
这也就是我们所说的第二类野指针(指针越界访问造成的野指针)
在这里插入图片描述

附1:

至于我们的第三类野指针成因,后续我更新到相应内容时,会顺路补充出来的,下章更精彩!
在这里插入图片描述

附2:文章内容所涉及的源代码

#define _CRT_SECURE_NO_WARNINGS 1

//#include<stdio.h>
//
//int main()
//{
//	//一般情况下,当你定义一个变量的时候,如果没有初始化,编译器通常会自动帮你初始化
//	int* p1;//这就是我们所有的第一种类型的野指针(指针未初始化)
//	//编译器随机跟你指向了一块地址,你并不知道是那块
//	*p1 = 2;
//
//
//
//
//
//	char suspicion = 1;
//	char* p2 = &suspicion;
//	return 0;
//}

#include<stdio.h>

int main()
{
	int arr[6] = { 6 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 6; i++)
	{
		*(p++) = i;
	}
	return 0;
}

备注:

楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

在这里插入图片描述

2022年1月27日

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

曜摆摆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值