c语言——野指针

1、概念

野指针就是指针指向的位置是不可知的、随机的、没有明确限制的。

2、生成的原因

1、指针未初始化
在创建指针变量时未初始化指针变量,会默认为随机值,如:

#include <stdio.h>
int main()
{ 
  int *pr;//创建时未进行初始化
  *pr = 1;
  return 0;
}

2、指针进行了越界访问
当指针指向的位置超出了所具有的范围,也会成为野指针,如:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* pr = &arr[0];
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		*(pr++) = 1;
	}
	return 0;
}

这个代码运行时便会报一个调试错误的信息,错误如下:

这里的错误原因便是内存的访问越界了。
3、指针指向的空间被释放
当指针指向的空间被直接释放时,这时该指针便会成为悬空指针,也是一种野指针,下次再使用该指针时便可能出现问题,如:

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

3、如何避免

1、在创建指针变量时对指针变量进行初始化
在知道指针指向哪的情况下,直接进行赋值想要指向的地址,在不知道指向哪的情况下,可以给指针赋值NULL,使其成为空指针,避免被读取。

int a = 1;
int*pr1 = &a;//知道地址直接赋值
int*pr2 = NULL;//不知道时赋值NULL

2、避免指针越界访问
代码中创建了哪些空间,指针便只能指向哪些空间,避免访问时超出范围,造成越界访问。
3、不使用指针变量后,对其赋值为NULL,下次使用时判断其安全性

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* pr = &arr[0];
	for (int i = 0; i < 5; i++)
	{
		*(pr++) = i;
	}//循环结束后p已经越界了
	pr = NULL;//不使用后赋值为NULL
	pr = &arr[0];//再次使用时重新进行赋值
    if (pr != NULL)// 使用前判断是否安全再使用
    {
        for (int i = 0; i < 5; i++)
	    {
		   *(pr++) = 0;
	    }
    }
	return 0;
}

对于上面的代码也可以使用**assert(断言)**进行判断,在使用时需要加上头文件:assert.h
使用方法:assert(pr != NULL);
运行到这个代码时便会进行判断,若pr不等于NULL则程序继续运行,若pr等于NULL程序则会停止,同时报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值