【C语言】_野指针 [复制链接]
发表于 2025-11-13 22:39:19 | 显示全部楼层 |阅读模式
目次
1. 野指针常见成因
1.1 指针未初始化
1.2 指针越界访问
1.3 指针指向的空间开释了
2. 规避野指针
2.1 指针初始化
2.2 鉴戒指针越界
2.3 指针变量利用前查抄有效性,不再利用时实时置NULL
2.4 克制返回局部变量的地点


野指针:野指针就是指针指向的位置是不可知的(禁绝确的、随机的、没有明白限定的)
1. 野指针常见成因

1.1 指针未初始化

  1. int main()
  2. {
  3. int* p;         //局部变量未初始化,默认为随机值
  4. *p=20;
  5. }
复制代码
注:p为局部变量,局部变量未初始化时默以为随机值;
1.2 指针越界访问

  1. int main() {
  2.         int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  3.         int* p = arr;
  4.         int i = 0;
  5.         int sz = sizeof(arr) / sizeof(arr[0]);
  6.         for (i = 0; i <= sz; i++) {
  7.                 printf("%d ", *p);
  8.                 p++;
  9.         }
  10.         return 0;
  11. }
复制代码
运行结果如下:

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

  1. int* test() {
  2.         int a = 10;
  3.         return &a;
  4. }
  5. int main() {
  6.         int* p = test();
  7.         printf("%d\n", *p);
  8.         return 0;
  9. }
复制代码
变量a作为局部变量,离开函数test ( ) 范围即烧毁,也就是a地点的内存地点已还给操纵体系,此时再在main()函数中利用该地点访问数据,该地点就是野指针;
2. 规避野指针

2.1 指针初始化

1、 界说指针变量时,若明白知道指针指向的位置则直接赋值具体地点,
若不知道指针指向的位置则可赋值NULL
  1. int main() {
  2.         int a = 10;
  3.         int* p1 = &a;
  4.         *p1 = 20;      // 正确
  5.         int* p2 = NULL;
  6.         // *p2 = 30;   // 错误
  7.         return 0;
  8. }
复制代码
2、 NULL是C语言中界说的一个标识符常量,值是0,0也是地点,但该地点无法利用,读写该地点会报错,NULL的界说如下:
  1. #ifndef NULL
  2.     #ifdef __cplusplus
  3.         #define NULL 0
  4.     #else
  5.         #define NULL ((void *)0)
  6.     #endif
  7. #endif
复制代码
2.2 鉴戒指针越界

一个步调只能通过指针访问其向内存申请的那部门空间,不能超出范围访问,超出范围访问就是越界访问;
2.3 指针变量利用前查抄有效性,不再利用时实时置NULL

  1. int main() {
  2.         int* p = NULL;
  3.         // 对指针进行判NULL的有效性判断
  4.         if (p != NULL) {
  5.                 *p = 20;
  6.         }
  7.         return 0;
  8. }
复制代码
2.4 克制返回局部变量的地点

比如1.3部门的示例:
函数test ( ) 内的变量a作为局部变量,离开test ( ) 函数范围即烧毁,也就是a地点的内存地点已还给操纵体系,此时再在main ( ) 函数中利用该地点访问数据,该地点就是野指针;



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表