56.C语言 野指针

最后更新于:2020-09-05 21:45:04

一.简介

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

二.野指针产生的原因

1.指针变量未初始化

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错‘point’ may be uninitializedin the function

image

2.指针释放后之后未置空

指针在freedelete后未赋值NULL,它们只是把指针所指的内存给释放掉,但并没有处理指针本身。此时指针指向不可知的(随机的、不正确的、没有明确限制的)。

释放后的指针应立即将指针置为NULL,防止产生野指针。

image

三.避免野指针产生

1.初始化时置 NULL

指针变量一定要初始化为NULL,因为任何指针变量(除了static修饰的指针变量)刚被创建时不会自动成为NULL指针,它的缺省值是随机的。

2.释放时置 NULL

当指针p指向的内存空间释放时,没有设置指针p的值为NULLdeletefree只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。例如:

/************************************************************************/
/*@文件名      : C/C++ 野指针.cpp
/*@日  期      : 2020/08/30 21:52
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 - 野指针
/************************************************************************/

#include<stdlib.h>
#include<stdio.h>


void main()
{

    int *p = new int(6);
    printf("释放内存之前 p:%p\n", p);

    //delete 释放内存
    delete p;

    if (p != NULL) //delete 之后指针指向未知/随机内存
        printf("释放内存之后 p:%p\n", p);

    //*p = 7; //操作未知/随机的内存地址,程序异常崩溃

    system("pause");
}

/*
输出:
释放内存之前 p:016950E8
释放内存之后 p:00008123
请按任意键继续. . .
*/

重上面的代码输出结果可以看出:

delete之后,指针p地址并没有被置为NULLp此时指向一块随机/未知的内存地址,一旦对未知的内存地址操作或者访问,程序崩溃


猜你喜欢

1. 指针和数组区别

2. 指针数组

3. NaN(Not a Number)

4. memcpy/strcpy/strcpy_s 区别

5. unicode 和多字节区别

6. 数组定义和使用

7. sizeof和strlen函数区别

8. Debug和_DEBUG区别

9. _WIN32/WIN32/_WIN64/WIN64区别

10. 判断exe可执行程序是32位的还是64位

11. 数组下标越界

12. 数组内存溢出

13. 数组下标越界和内存溢出区别

14. 二维数组行数和列数计算

15. 指针声明和定义

16. 指针p++/p-–



转载请注明: 猿说编程 » C/C++教程 » 野指针

赞赏

微信赞赏支付宝赞赏