C语言 野指针和空指针

悠悠 2022-09-12 13:59 364阅读 0赞

文章目录

  • 空指针
    • 问题思考:
    • 案例探索:不允许向NULL和非法地址拷贝内存
  • 野指针
    • 什么情况下会导致野指针?
      • 指针变量未初始化
      • 指针释放后未置空
      • 指针操作超越变量作用域
    • 如何规避野指针
      • 初始化时置 NULL
      • 释放时 置 NULL

空指针

标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。要使一个指针为NULL,可以给它赋值一个零值。为了测试一个指针百年来那个是否为NULL,你可以将它与零值进行比较。

对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针因引用是一个非法的操作,在解引用之前,必须确保它不是一个NULL指针。

问题思考:

如果对一个NULL指针间接访问会发生什么呢?
结果因编译器而异。
像VS就报错,像DEV这种牛逼的编译器就没事。

案例探索:不允许向NULL和非法地址拷贝内存

不允许向NULL和非法地址拷贝内存:

  1. #include<iostream>
  2. #include<math.h>
  3. #include<string.h>
  4. using namespace std;
  5. void test() {
  6. char *p = NULL;
  7. //给p指向的内存区域拷贝内容
  8. strcpy(p, "1111"); //err
  9. char *q = (char *)0x1122;
  10. //给q指向的内存区域拷贝内容
  11. strcpy(q, "2222"); //err
  12. }
  13. int main()
  14. {
  15. test();
  16. return 0;
  17. }

运行上面的案例就会报错。
在这里插入图片描述

野指针

在使用指针时,要避免野指针的出现:
野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

什么情况下会导致野指针?

指针变量未初始化

任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

比如下面代码

  1. void test(){
  2. int* p = 0x001; //未初始化
  3. printf("%p\n",p);
  4. *p = 100;
  5. }

虽然手动给出了地址,但是仍没有指向合法的内存
在这里插入图片描述

指针释放后未置空

有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

指针操作超越变量作用域

不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

如何规避野指针

操作野指针是非常危险的操作,应该规避野指针的出现:

初始化时置 NULL

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

比如上面的案例,就可以改成:

  1. #include<iostream>
  2. #include<math.h>
  3. #include<string.h>
  4. using namespace std;
  5. void test() {
  6. int* p = NULL; //初始化
  7. printf("%p\n", p);
  8. p = new int;
  9. *p = 100;
  10. printf("%p\n", p);
  11. printf("%d\n", *p);
  12. }
  13. int main()
  14. {
  15. test();
  16. return 0;
  17. }

在这里插入图片描述

释放时 置 NULL

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

例如上面使用完了之后,可以进行下面的操作 释放p 置 NULL。

  1. delete p;
  2. p = NULL;

发表评论

表情:
评论列表 (有 0 条评论,364人围观)

还没有评论,来说两句吧...

相关阅读

    相关 指针指针区别

    空悬指针是:它曾经指向一个有效地址,但是现在不再指向有效地址,就是原来的那块地址不能通过这个指针区访问了。这通常是因为指针所指的内存单位被释放了并且不再有效了。空悬指针存在并没

    相关 C++ 指针悬空指针

    都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。 野指针:指的是没有被初始化过的指针。 int main(void) 

    相关 C语言指针分析

    1. 野指针的概念                  所谓的野指针,就是说指针指向的那块内存,你没有合法操作的权限,也就是指针指向非法的内存空间,这样的指针就叫做野指针。

    相关 C语言指针

    野指针产生原因:利用 free函数释放了指针的内存空间 但指针本身没有重置为NULL 造成 释放的时候 仍可以通过 p!=NULL 进行判断 避免方法 在定义指针时