C语言学习笔记——野指针

目录

一、野指针

定义:

二、野指针的几种情况

1.非法访问

2.指针越界访问

3.指针指向的空间释放

三、避免野指针

1.指针初始化

2.小心指针越界

3.指针指向空间释放即时置NULL(“0”)

4.避免返回局部变量的地址

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


一、野指针

定义:

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


二、野指针的几种情况

1.非法访问

p未被定义,导致p指向的内存空间地址是随机的,不能向随机地址空间写数据。

int main()
{
	int* p; //局部变量指针未初始化,没有明确的指向,为随机值:0xcccccccc
	*p=10;  //地址所在的空间不是原p的空间
	return 0;
}

2.指针越界访问

当指针逐步解引用时,指针指向的范围超出数组的范围,p就是野指针。

Ps:如果指针指向刚好到临界点,但没继续访问就不算越界访问。

#include <stdio.h>
int main()
{
	int a[6] = {0};//数组a中的6个元素都为0
	int* p = a;//p=a中第一个元素的地址,即p=&a[0]
	for(int i = 0;i <= 6;i++)//7次循环,超出范围
	{
		*p = i;
        p++;
	}
	return 0;
}

3.指针指向的空间释放

在主函数中调用test函数,p指针接收变量a的地址,因a所在的空间是局部的,调用之后a空间释放,代码中的10不属于变量a(但是在没覆盖之前仍然可以通过指针找到对应的值),然而在主函数中p已经被赋予原空间的内容,因此p无法通过此地址去找原来的空间。就好像一栋楼房被拆迁了(空间),但是地图上的地址仍然保持不变(地址不变),当我们通过该地址去找这栋楼是无法实现的。

int* test()
{
	int a=10;
	return &a;//返回a地址,假设是0x001611f1
}

int main()
{
	int* p= test();//调用函数,*p=0x001611f1
	printf("%d\n",*p);//局部变量空间释放,无法找回原空间的变量
	return 0;
}

三、避免野指针

1.指针初始化

2.小心指针越界

3.指针指向空间释放即时置NULL(“0”)

4.避免返回局部变量的地址

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

#include<stdio.h>
int main()
{
    int *p = NULL;//在不确定指针时,将其赋予NULL
    int a = 10;
    p = &a;
    if(p != NULL)//当指针p指向有效空间时才能被赋值
    {
        *p = 20;
    }
    return 0;
}
  • 使用指针时要多加留意,避免野指针的出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值