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语言规避野指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明

    Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明

    这篇文章主要介绍了Qt图形图像开发曲线图表模块QChart库基本用法、各个类之间的关系说明,需要的朋友可以参考下
    2020-03-03
  • 详解C++17中nodiscard标记符的使用

    详解C++17中nodiscard标记符的使用

    在C++ 17中引入了一个标记符nodiscard,用于声明一个 “非弃值(no-discard)表达式”。这篇文章就来和大家来聊一聊nodiscard标记符的使用吧
    2023-02-02
  • C语言版医院管理系统

    C语言版医院管理系统

    这篇文章主要为大家详细介绍了C语言版医院管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++ Clock类模拟实现闹钟运行

    C++ Clock类模拟实现闹钟运行

    这篇文章主要为大家详细介绍了C++ Clock类模拟实现闹钟运行,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++实现LeetCode(65.验证数字)

    C++实现LeetCode(65.验证数字)

    这篇文章主要介绍了C++实现LeetCode(65.验证数字),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++中的继承关系

    c++中的继承关系

    继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,本文给大家介绍c++中的继承关系,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • C++连接mysql数据库并读取数据的具体步骤

    C++连接mysql数据库并读取数据的具体步骤

    在实际开发中我们经常需要对数据库进行访问,针对不同类型的数据库(如MySQL、sqLite、Access、Excel等),如果采用不同的方法进行连接,会把我们搞崩溃,下面这篇文章主要给大家介绍了关于C++连接mysql数据库并读取数据的具体步骤,需要的朋友可以参考下
    2023-04-04
  • Qt实现SqlRelationalTable关联表组件

    Qt实现SqlRelationalTable关联表组件

    在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵活运用,感兴趣的可以了解一下
    2023-12-12
  • C语言实现运动会管理系统

    C语言实现运动会管理系统

    这篇文章主要为大家详细介绍了C语言实现运动会管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言二叉树的非递归遍历实例分析

    C语言二叉树的非递归遍历实例分析

    这篇文章主要介绍了C语言二叉树的非递归遍历,包括了先序遍历、中序遍历与后序遍历,需要的朋友可以参考下
    2014-09-09

最新评论