“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用 “野指针”的成因主要有两种:
(1)指针变量没有被初始化。 任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如

复制代码代码如下:

char *p = NULL;
     char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7.5节。
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。

用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。

如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

复制代码代码如下:

char *p = (char *) malloc(100);
     strcpy(p, “hello”);
     free(p);         // p 所指的内存被释放,但是p所指的地址仍然不变
     …
     if(p != NULL)      // 没有起到防错作用
     {
        strcpy(p, “world”);      // 出错
}

示例7-5 p成为野指针
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:

复制代码代码如下:

 class A 
{      
public:
     void Func(void){ cout << “Func of class A” << endl; }
};
     void Test(void)
{
     A *p;
           {
                 A a;
                 p = &a;      // 注意 a 的生命期
}
           p->Func();            // p是“野指针”
}

函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。
实例程序:

复制代码代码如下:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  char *p = NULL;
  p = (char*)malloc(sizeof(char)*100);
  printf("指针p的地址是:%p\n", p);
  strcpy(p, "Hello");
  printf("%s\n", p);
  free(p);

printf("指针p的地址是:%p\n", p);

system("PAUSE"); 
  return 0;
}

运行截图如下:

可以看出,虽然使用 free(p) ,释放了p指向的地址空间,但是这个指针还是存在的,只是指向的是“垃圾”内存。
此时p的状态就被称为是“野指针”

基于C语言中野指针的深入解析相关推荐

  1. 转载:基于C语言中野指针的深入解析

    *原文链接:http://www.jb51.net/article/39692.htm "野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用N ...

  2. c语言野指针应用,C语言中野指针的深入解析

    C语言中野指针的深入解析 C语言中野指针这一块是C语言的难点,下面小编为大家带来了C语言中野指针的深入解析,欢迎大家阅读! "野指针"的成因主要有两种: (1)指针变量没有被初始化 ...

  3. C语言中野指针、NULL、0与‘\0’的区别与用途

    野指针:未初始化或初始化的指针. int*p;printf("%d",*p); NULL:代表空指针,也就是指向一个不被使用的地址. 0 :0用于数值,但在大多数系统中,都将0作为 ...

  4. C语言中野指针与内存泄漏

    内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束.即所谓内存泄漏. 注意:内存泄漏是指堆内存的泄漏. 简单的说就是申请了 ...

  5. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  6. c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...

  7. c语言中程序偏离,C语言中的指针加减偏移量

    首先看一段程序: #include int main() { int a[5] = {1, 2, 3, 4, 5}; int* p = (int*)(&a + 1); printf(" ...

  8. c语言中指针的类型,学习C语言中的指针类型

    摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...

  9. C语言中的指针有什么作用

    C语言中的指针的作用是:通过指针不仅可以对数据本身,还可以对存储数据的变量地址进行操作.指针就是内存地址,指针变量是用来存放内存地址的变量. 指针定义: 指针,是C语言中的一个重要概念及其特点,也是掌 ...

最新文章

  1. Redis 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
  2. 关于Visual Studio 2010与64位系统的问题
  3. 对 VR 项目开发流程的调研
  4. 如何获取程序返回值,退出码,错误码
  5. 如何求解问题--数据结构与算法入门
  6. SVN无法commit解决办法
  7. 多线程计算0-100 0-200 的和
  8. 南京工业大学浦江学院计算机学院,招生季 叮~让你爱上南京工业大学浦江学院的若干个理由...
  9. JVM调优之jstack找出发生死锁的线程
  10. 嵌入式系统串口解析二进制数_嵌入式系统Bootloader分析及DSP56F800串口加载功能实现...
  11. basler相机的触发线是那两脚_探究机器视觉领域线扫相机和面阵相机的区别
  12. CentOS网络配置解决方案
  13. js/jquery判断浏览器的方法小结
  14. 洛克人html5,《洛克人Zero/Zx合集》:跳票冷饭,与预期有差但依旧很香
  15. 如何在Sitecore CMS中打开内容编辑器
  16. JS获取浏览器滚动条的宽度
  17. PHP--数据库访问(增、删、改、查)
  18. SVN客户端的安装与使用----第一章
  19. 大数据技术原理与应用学习笔记(八)
  20. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)前言

热门文章

  1. 零基础读懂金融学(一)名词
  2. 3D目标检测SE-SSD 模型工程化复现
  3. oracle ogg 和 DataGuard比较
  4. 全球及中国VOC回收与处理行业研究及十四五规划分析报告
  5. 公文OCR开发包软件
  6. Windows 7 Windows Server 2008 R2 简体中文版下载 (2023 年 3 月更新)
  7. 去掉tppabs冗余代码和注释
  8. 2018年孔子学院最新数据
  9. SeaBIOS(1) - 简介
  10. RPG游戏《黑暗之光》流程介绍与代码分析之(一):游戏载入界面的创建