出现野指针的几种情况

什么是野指针:

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

野指针1:指针变量的值未被初始化 

        如果指针声明在全局变量区,那么未初始化的指针缺省为空。

        如果指针声明在栈区,那么该指针将随意指向一个地址空间。

void test() {
	int* ptr;  //野指针,编译器报错
	if (ptr != NULL) {

	}
}

野指针2: 指针所指向的地址空间已经被free或delete

        在堆上malloc或者new申请的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存

void test() {
	char* ptr = (char*)malloc(sizeof(char) * 64);
	strcpy(ptr, "Hello!");
	free(ptr);  //此时ptr所指向的内存已经被释放,但是ptr指向的地址依然存在

	//printf("%s", ptr);  //出错,此时ptr为一个野指针
	if (ptr != NULL) {  //ptr指向的地址依然存在
		strcpy(ptr, "Hello,Wang");
	}
	printf("%s", ptr);  //输出:Hello,Wang

}

野指针3: 指针操作超越了作用域

        超越了作用域,此时作用域里的内存已经被回收

//野指针3
void test3() {
	int* ptr3 = NULL;

	{
		int a = 10;
		ptr3 = &a;
	}//a的作用域结束,a被回收

	int b = *ptr3; //ptr3指向a,a被回收,此时ptr3为野指针
	printf("%d", b);
}

解决办法:

1、初始化置NULL

2、申请内存后判空:malloc申请内存后判别是否为空

3、指针释放后置NULL

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值