【C语言】_野指针

目录

[1. 野指针常见成因](#1. 野指针常见成因)

[1.1 指针未初始化](#1.1 指针未初始化)

[1.2 指针越界访问](#1.2 指针越界访问)

[1.3 指针指向的空间释放了](#1.3 指针指向的空间释放了)

[2. 规避野指针](#2. 规避野指针)

[2.1 指针初始化](#2.1 指针初始化)

[2.2 小心指针越界](#2.2 小心指针越界)

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

[2.4 避免返回局部变量的地址](#2.4 避免返回局部变量的地址)


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

1. 野指针常见成因

1.1 指针未初始化

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

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

1.2 指针越界访问

cpp 复制代码
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 指针指向的空间释放了

cpp 复制代码
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

cpp 复制代码
int main() {
	int a = 10;
	int* p1 = &a;
	*p1 = 20;      // 正确

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

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

cpp 复制代码
#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

2.2 小心指针越界

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

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

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

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

比如1.3部分的示例:

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

相关推荐
掘根2 小时前
【消息队列项目】客户端四大模块实现
开发语言·后端·ruby
疯狂的挖掘机8 小时前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
cnxy1888 小时前
围棋对弈Python程序开发完整指南:步骤4 - 提子逻辑和劫争规则实现
开发语言·python·机器学习
意趣新8 小时前
C 语言源文件从编写完成到最终生成可执行文件的完整、详细过程
c语言·开发语言
李艺为9 小时前
根据apk包名动态修改Android品牌与型号
android·开发语言
黄河滴滴9 小时前
java系统变卡变慢的原因是什么?从oom的角度分析
java·开发语言
老华带你飞10 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
superman超哥10 小时前
Rust Workspace 多项目管理:单体仓库的优雅组织
开发语言·rust·多项目管理·rust workspace·单体仓库
kylezhao201910 小时前
C#通过HSLCommunication库操作PLC用法
开发语言·c#
lengjingzju11 小时前
一网打尽Linux IPC(三):System V IPC
linux·服务器·c语言