C语言规避野指针的方法流程

 更新时间:2024年03月13日 10:59:58   作者:li-wait  
野指针就是指针指向的不是一个有效(合法)的地址,在程序中,如果访问野指针,可能会造成程序的崩溃,这篇文章主要介绍了C语言如何规避野指针,需要的朋友可以参考下

野指针就是指针指向的不是一个有效(合法)的地址。
在程序中,如果访问野指针,可能会造成程序的崩溃。

出现野指针的情况主要有三种:
1)指针在定义的时候,如果没有进行初始化,它的值是不确定的(乱指一气)。
2)如果用指针指向了动态分配的内存,内存被释放后,指针不会置空,但是,指向的地址已失效。
3)指针指向的变量已超越变量的作用域(变量的内存空间已被系统回收),让指针指向了函数的局部变量,或者把函数的局部变量的地址作为返回值赋给了指针。

规避方法:
1)指针在定义的时候,如果没地方指,就初始化为nullptr。
2)动态分配的内存被释放后,将其置为nullptr。
3)函数不要返回局部变量的地址。
注意:野指针的危害比空指针要大很多,在程序中,如果访问野指针,可能会造成程序的崩溃。是可能,不是一定,程序的表现是不稳定,增加了调试程序的难度。

下面看下C语言如何规避野指针,具体内容如下所示:

一、概念:

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

二、野指针成因:

2.1. 指针未初始化

1. 指针未初始化
#include <stdio.h>
int main()
{
    int *p;//局部变量指针未初始化,默认为随机值
    *p = 20;
    return 0;
}

2.2 指针越界访问

#include <stdio.h>
int main()
{
    int arr[10] = {0};
    int *p = &arr[0];
    int i = 0;
    for(i=0; i<=11; i++)
    {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
    }
    return 0;
}
 

2.3指针指向的空间释放

#include <stdio.h>
int* test()
{
    int n = 100;
    return &n;
}
int main()
{
    int*p = test();
    printf("%d\n", *p);
    return 0;
}

三、如何规避野指针

3.1 指针初始化

        如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以给指针赋值NULL.
        NULL 是C语言中定义的⼀个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。
        初始化如下:

#include <stdio.h>
int main()
{
    int num = 10;
    int*p1 = #
    int*p2 = NULL;
    return 0;
}

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

        当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使这用个指针访问空间的时候,我们可以把该指针置为NULL。因为约定俗成的⼀个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。
        我们可以把野指针想象成野狗,野狗放任不管是非常危险的,所以我们可以找⼀棵树把野狗拴起来,就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓前来,就是把野指针暂时管理起来。
       不过野狗即使拴起来我们也要绕着走,不能去挑逗野狗,有点危险;对于指针也是,在使用之前,我们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是,不能直接使用;如果不是,我们再去使用。

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,7,8,9,10};
    int *p = &arr[0];
    for(int i=0; i<10; i++)
    {
        *(p++) = i;
    }
    //此时p已经越界了,可以把p置为NULL
    p = NULL;
    //下次使⽤的时候,判断p不为NULL的时候再使⽤
    p = &arr[0];//重新让p获得地址
    if(p != NULL) //判断
    {
        //...
    }
    return 0;
}

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

如造成野指针的第3个例子,不要返回局部变量的地址。

到此这篇关于C语言规避野指针的方法流程的文章就介绍到这了,更多相关C语言规避野指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ typeid 和虚函数详解

    C++ typeid 和虚函数详解

    这篇文章主要介绍了c++ typeid 和虚函数的使用,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-09-09
  • C++11 关键字 const 使用小结

    C++11 关键字 const 使用小结

    const大致意思是“我承诺不改变这个值”。主要用于说明接口,这样在把变量传入函数时就不必担心变量会在函数内被改变,本文给大家介绍C++11 关键字 const 使用小结,感兴趣的朋友一起看看吧
    2021-12-12
  • C语言格式输出二进制的2种方法总结

    C语言格式输出二进制的2种方法总结

    众所周知C中以八进制,十进制和十六进制都可以通过%o,%d和%x轻松实现,然而唯独没有提供二进制输出的快速方式,下面这篇文章主要给大家介绍了关于C语言格式输出二进制的2种方法,需要的朋友可以参考下
    2022-08-08
  • C++实现数据文件存储与加载

    C++实现数据文件存储与加载

    这篇文章主要为大家详细介绍了C++实现数据文件存储与加载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • C++编译器和链接器工作原理及使用方法完全指南

    C++编译器和链接器工作原理及使用方法完全指南

    本文将详细介绍C++中的编译器和链接器以及它们的工作原理及使用方法全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • C语言实现哈夫曼树

    C语言实现哈夫曼树

    这篇文章主要为大家详细介绍了C语言实现哈夫曼树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言递归思想实现汉诺塔详解

    C语言递归思想实现汉诺塔详解

    大家好,本篇文章主要讲的是C语言递归思想实现汉诺塔详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 嵌入式C程序优质编写全面教程规范

    嵌入式C程序优质编写全面教程规范

    这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序。感觉是有一定的参考价值,所以拿出来分享,抛砖引玉
    2022-04-04
  • linux下c语言中隐藏进程命令行参数(例如输入密码等高危操作)

    linux下c语言中隐藏进程命令行参数(例如输入密码等高危操作)

    启动程序很多时候用命令行参数可以很方便,做到简化一些配置,但是输入用户名密码等操作,如果通过进程查看工具直接看到密码就太不安全了,这里就为大家分享一下方法
    2021-01-01
  • C语言单链表贪吃蛇小游戏

    C语言单链表贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C语言单链表贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论