当前位置: 首页 > article >正文

【C语言】_野指针

目录

1. 野指针常见成因

1.1 指针未初始化

1.2 指针越界访问

1.3 指针指向的空间释放了

2. 规避野指针

2.1 指针初始化

2.2 小心指针越界

2.3 指针变量使用前检查有效性,不再使用时及时置NULL

2.4 避免返回局部变量的地址


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

1. 野指针常见成因

1.1 指针未初始化

int main()
{
int* p;         //局部变量未初始化,默认为随机值
*p=20;
}

注:p为局部变量,局部变量未初始化时默认为随机值;

1.2 指针越界访问

int main() {
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i <= sz; i++) {
		printf("%d ", *p);
		p++;
	}
	return 0;
}

运行结果如下:

由于循环体循环了11次,当指针p指向的位置超出数组arr的范围时,p就是野指针;

1.3 指针指向的空间释放了

int* test() {
	int a = 10;
	return &a;
}
int main() {
	int* p = test();
	printf("%d\n", *p);
	return 0;
}

变量a作为局部变量,离开函数test ( ) 范围即销毁,也就是a所在的内存地址已还给操作系统,此时再在main()函数中使用该地址访问数据,该地址就是野指针;

2. 规避野指针

2.1 指针初始化

1、 定义指针变量时,若明确知道指针指向的位置则直接赋值具体地址,

若不知道指针指向的位置则可赋值NULL

int main() {
	int a = 10;
	int* p1 = &a;
	*p1 = 20;      // 正确

	int* p2 = NULL;
	// *p2 = 30;   // 错误
	return 0;
}

2、 NULL是C语言中定义的一个标识符常量,值是0,0也是地址,但该地址无法使用,读写该地址会报错,NULL的定义如下:

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

2.2 小心指针越界

一个程序只能通过指针访问其向内存申请的那部分空间,不能超出范围访问,超出范围访问就是越界访问;

2.3 指针变量使用前检查有效性,不再使用时及时置NULL

int main() {
	int* p = NULL;
	// 对指针进行判NULL的有效性判断
	if (p != NULL) {
		*p = 20;
	}
	return 0;
}

2.4 避免返回局部变量的地址

比如1.3部分的示例:

函数test ( ) 内的变量a作为局部变量,离开test ( ) 函数范围即销毁,也就是a所在的内存地址已还给操作系统,此时再在main ( ) 函数中使用该地址访问数据,该地址就是野指针;


http://www.kler.cn/a/469169.html

相关文章:

  • Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面
  • 【HarmonyOS-ArkTS语言】面向对象【合集】
  • Scala_【5】函数式编程
  • 基于物联网的冻保鲜运输智能控制系统
  • 如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构
  • c# Record关键字
  • 利用DHCP自动分配IP
  • 手工专项测试--接口测试(jmeter)--单接口与关联接口与断言
  • 百度Android最新150道面试题及参考答案 (中)
  • 《Vue进阶教程》第三十四课:toRefs的使用
  • 【开源免费】基于SpringBoot+Vue.JS作业管理系统(JAVA毕业设计)
  • [python3]Excel解析库-xlrd
  • 简历_专业技能_熟悉分布式锁Redisson的原理以及使用
  • Linux2.4.20顶层Makefile文件分析
  • 【网络安全实验室】SQL注入实战详情
  • Fast R-CNN模型详解及分析
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现
  • MFC读写文件实例
  • asp.net core中的 Cookie 和 Session
  • CSS——7.CSS注释
  • 信号的产生、处理
  • S32K144 UDSdoCAN 升级刷写实现笔记
  • 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署
  • Qt之屏幕录制设计(十六)
  • 系统架构师考试-ABSD基于架构的设计方法
  • python 实现贪心算法(Greedy Algorithm)