鱼C论坛

 找回密码
 立即注册
查看: 2071|回复: 0

[学习笔记] 015-野指针

[复制链接]
发表于 2018-8-19 10:06:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
1、野指针及成因
        野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。
成因:
        1.指针变量未初始化
                任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitializedin the function ”。
        2.指针释放后之后未置空
                有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
        3.指针操作超越变量作用域
                不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
2、野指针的规避
三步走:
        1.初始化的是定义指针变量的时候,指针变量赋值成null
        2. 释放的时候,判断是不是null,如果是NULL则不释放
        3. 释放完毕以后再赋值成null
3、程序示例
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #include "malloc.h"

  5. // 创建二维内存空间给指针
  6. char ** spitString_Creat(int mycount)
  7. {
  8.         int i = 0;
  9.         char **myarray = NULL;

  10.         if (mycount > 1000)      // 如果要求创建空间大于1000,不予创建
  11.         {
  12.                 return NULL;
  13.         }

  14.         myarray = (char **)malloc(mycount * sizeof(char *));
  15.         if (myarray == NULL)
  16.         {
  17.                 return NULL;
  18.         }
  19.         for (i = 0; i<10; i++)
  20.         {
  21.                 myarray[i] = (char *)malloc(100);
  22.         }

  23.         return myarray;
  24. }

  25. // 释放创建的二维内存空间
  26. void  spitString05_free(char **myarray, int ncount)
  27. {
  28.         int i = 0;
  29.         if (myarray == NULL)
  30.         {
  31.                 return;
  32.         }
  33.         for (i = 0; i<ncount; i++)
  34.         {
  35.                 if (myarray[i] != NULL) free(myarray[i]);
  36.         }
  37.         if (myarray != NULL)
  38.         {
  39.                 free(myarray);
  40.         }
  41.         // 下面在函数中直接修改形参的值,是不会改变实参的值
  42.         // 函数调用中,用3级指针(形参)才能去修改2级指针(实参)的值,所以下面的修改并不会反映到实参中。
  43.         myarray = NULL; //垃圾
  44. }

  45. void main()
  46. {
  47.         int  i = 0;
  48.         int ncount = 10;
  49.         char **myarray = NULL;

  50.         //1初始化的是定义指针变量的时候,指针变量赋值成null
  51.         char ** myarray1 = NULL;
  52.         char **myarray2 = NULL;
  53.         char **myarray3 = NULL;

  54.         myarray1 = spitString_Creat(10);
  55.         if (myarray1 == NULL)
  56.         {
  57.                 printf("func spitString_Creat() \n");
  58.                 goto End;           // 合理使用goto,无条件转移
  59.         }

  60.         myarray2 = spitString_Creat(10000);
  61.         if (myarray2 == NULL)
  62.         {
  63.                 printf("func spitString_Creat() \n");
  64.                 goto End;
  65.         }

  66.         myarray3 = spitString_Creat(10);
  67.         if (myarray3 == NULL)
  68.         {
  69.                 printf("func spitString_Creat() \n");
  70.                 goto End;
  71.         }

  72.         for (i = 0; i<ncount; i++)
  73.         {
  74.                 printf("%s\n", myarray[i]);
  75.         }

  76. End:
  77.         //2 释放的时候,判断是不是null
  78.         //3 释放完毕以后再赋值成null
  79.         if (myarray1 != NULL)
  80.         {
  81.                 spitString05_free(myarray1, 10);
  82.                 myarray1 = NULL;
  83.         }

  84.         if (myarray2 != NULL)
  85.         {
  86.                 spitString05_free(myarray2, 10);
  87.                 myarray2 = NULL;
  88.         }

  89.         if (myarray3 != NULL)
  90.         {
  91.                 spitString05_free(myarray3, 10);
  92.                 myarray3 = NULL;
  93.         }

  94.         system("pause");
  95. }
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表