C语言野指针及如何规避详解

 更新时间:2023年09月25日 11:28:05   作者:謓泽  
这篇文章主要为大家介绍了C语言野指针及如何规避详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1:什么是野指针?

野指针:就是指针指向的位置是不可知(随机性,初始化,不正确,没有明确限制),指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。

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

2:如何规避野指针

指针变量的初始化

int a = 10;	     
	int* pa = &a;	  //指针变量的初始化

指针常见错误

引用未初始化的指针变量

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

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

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

指针指向的空间如果我们还回去的话,就把指针指针置为NULL 

NULL——空指针,用来初始化指针或者给指针赋值,可以转到定义看看 #define NULL    ((void *)0)

说的简单一点就是:当你指针不知道怎么赋值,就赋值给一个空指针 NULL  

Null是在计算中具有保留的值,用于指示指针不引用有效对象。程序通常使用空指针来表示条件,例如未知长度列表的结尾或未执行某些操作; 这种空指针的使用可以与可空类型和选项类型中的Nothing值进行比较。

空指针不应与未初始化的指针混淆:保证空指针与指向有效对象的任何指针进行比较。但是,根据语言和实现,未初始化的指针可能没有任何此类保证。它可能与其他有效指针相等; 或者它可能比较等于空指针。它可能在不同的时间做两件事。

int a = 10;			
	int* pa = &a;
	printf("%d\n", *pa);
	*pa = 20;				//此时当我们不想用它时候
	pa = NULL;				//就把pa指针置成NULL
	printf("%d\n",pa);

指针使用之前检查有效性

当你指针变量不可以用的时候就把它设置成NULL,当你指针变量可以用的时候就不是NULL。

就是当我们对这个指针进行初始化的话,那么它就是有效的,如果没有初始化那么就是无效的。

	if (pa != NULL)
	{
		//进行使用
	}
	if (pa == NULL)
	{
		//不进行使用
	}

以上就是C语言野指针及如何规避详解的详细内容,更多关于C语言野指针规避的资料请关注脚本之家其它相关文章!

相关文章

  • C++函数参数匹配规则示例小结

    C++函数参数匹配规则示例小结

    这篇文章主要介绍了C++函数参数匹配规则,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • 关于统计数字问题的算法

    关于统计数字问题的算法

    本文介绍了统计数字问题的算法,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9,并有每一步的解题思路,需要的朋友可以参考下
    2015-08-08
  • C语言fillpoly函数详解

    C语言fillpoly函数详解

    在C语言中,fillpoly函数的功能是画一个多边形,并且把多边形填充。填充边框所定义的多边形的内部。fillpoly 函数的用法:void far fillpoly(int numpoints, int far *polypoints);。
    2015-10-10
  • C语言实现扫雷小游戏

    C语言实现扫雷小游戏

    这篇文章主要为大家详细介绍了C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • VC6.0代码自动提示 VC6.0在win7环境下代码提示智能化

    VC6.0代码自动提示 VC6.0在win7环境下代码提示智能化

    作为程序猿的你,是否已经喜欢或习惯依赖IDE开发环境呢,有了IDE环境,即使你想不起方法全名,只要知道某个前缀,或哪怕在提示列表中,一一查询,也可以找到自己想找的方法或属性
    2013-01-01
  • C++ sort排序之降序、升序使用总结

    C++ sort排序之降序、升序使用总结

    这篇文章主要介绍了C++ sort 排序(降序、升序)使用总结,需要的朋友可以参考下
    2020-11-11
  • C++使用标准库实现事件和委托以及信号和槽机制

    C++使用标准库实现事件和委托以及信号和槽机制

    这篇文章主要为大家详细介绍了C++如何使用标准库实现事件和委托以及信号和槽机制,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-11-11
  • KMP 算法实例详解

    KMP 算法实例详解

    这篇文章主要介绍了KMP 算法实例详解的相关资料,MP的关键是求出next的值、先预处理出next的值,需要的朋友可以参考下
    2017-07-07
  • C++ OpenCV绘制简易直方图DrawHistImg

    C++ OpenCV绘制简易直方图DrawHistImg

    本文主要介绍了一个能绘制简易直方图的简单函数DrawHistImg,可以帮助大家快速掌握绘制的原理,可以根据自己的创意对其进行改善和补充。需要的朋友可以参考一下
    2021-12-12
  • 基于C语言实现计算生辰八字五行的示例详解

    基于C语言实现计算生辰八字五行的示例详解

    生辰八字,简称八字,是指一个人出生时的干支历日期;年月日时共四柱干支,每柱两字,合共八个字。这篇文章主要介绍了C语言实现计算生辰八字五行的示例代码,需要的可以参考一下
    2023-03-03

最新评论