野指针、NULL指针和void*

时间:2022-09-24 09:05:05

一、野指针

“野指针”不是NULL指针,是指向“垃圾”内存的指针。

“野指针”的成因主要有三种:

(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
     char *p = NULL;
     char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。

  free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
  如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

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

(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就成了“野指针”。

二、空指针/0/NULL

空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0.

NULL 是一个标准规定的宏定义,用来表示空指针常量。

  #define NULL 0

  或者

  #define NULL ((void*)0)

判断一个指针是否为空指针:

  f(!p) 、 if(p == NULL)  和 if(NULL == p)

最好使用后两种,有些平台NULL不是0,这时候程序就会有问题了。

其中if(NULL == p) 与if(p == NULL) 没有区别,前一种是避免错误的写法(后面的容易写成P=NULL,编译器不能发现。而前面的写成NULL=p时会编译不过)。

一般在使用指针前(特别是对其进行加减)要对其进行判断 if(p == NULL) , 如函数返回的地址等进行非空判断。

如:

Item* pItem = itemList.getItem(index);

Item* ItemList::getItem(int index)
{
    if (index < 0) return NULL;
    if (index >= size()) return NULL;
    return _list[index];
}
如果返回的是空指针,且后面对pItem做了相关的操作,会有空指针异常,程序可能会崩溃。

调用free(p)函数后应对p置空,即p=NULL。

三、void指针

void *可以指向任何类型的数据。

任何指针都可以赋值给void指针。

void指针赋值给其他类型的指针时都要进行转换,如malloc 函数,其返回类型是 void* 类型。

int* p;

p = (int *) malloc (sizeof(int));

赋值前要进行强制转化。

野指针、NULL指针和void*的更多相关文章

  1. NULL指针 Void&ast; 和野指针

    在C和C++的语言中常常有这几个概念: NULL指针.空指针.Void *指针.野指针(Wild Pointer)甚至垂悬指针(Dangling Pointer). 1.NULL指针,一般用于指向一个 ...

  2. NULL指针、零指针、野指针

    1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成 ...

  3. C&plus;&plus;的空指针、野指针和指针赋值NULL&period;md

    1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1( ...

  4. void指针和NULL指针

    Void指针和NULL指针 Void指针: Void指针我们称之为通用指针,就是可以指向任意类型的数据.也就是说,任何类型的指针都可以赋值给Void指针. 举例: #include<stdio. ...

  5. void指针、NULL指针和未初始化指针

    一个指针可以被声明为void类型,比如void *x.一个指针可以被赋值为NULL.一个指针变量声明之后但没有被赋值,叫做未初始化指针. 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  6. 指针专题6-空指针NULL和void指针

    1 NULL指针 一个指针变量可以指向计算机中任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给他,他就可以指向.C语言没有一种机制保证指向内存的正确性,程序员必须自己提高 ...

  7. 空指针、NULL指针、零指针

    1. 空指针.NULL指针.零指针 1.1 什么是空指针常量 0.0L.'\0'.3 - 3.0 * 17 (它们都是“integer constant expression”)以及 (void*)0 ...

  8. 提领NULL指针

    通常之中导致程序崩溃的最重要的原因是试图取消引用NULL指针.正如在以前的文章中指出,智能指针RefCountPtr和ScopedPtr它提供了一个诊断的执行时间. 但,并不是所有的指针是所有的对象都 ...

  9. 为什么NULL指针也能访问成员函数?&lpar;但不能访问成员变量&rpar;

    查看更加详细的解析请参考这篇文章:http://blog.51cto.com/9291927/2148695 看一个静态绑定的例子: 1 #include <iostream> 2 3 u ...

随机推荐

  1. 浅谈开源项目Android-Universal-Image-Loader&lpar;Part 3&period;1&rpar;

    本文转载于:http://www.cnblogs.com/osmondy/p/3266023.html 浅谈开源项目Android-Universal-Image-Loader(Part 3.1) 最 ...

  2. div(固定宽度和不固定宽度)居中显示的方法总结

    今天我总结一下css实现div居中的方法,有的是固定宽度的,还有的是不固定宽度的. 1.使用自动外边距实现DIV CSS居中 CSS中首选的让元素水平居中的方法就是使用margin属性—将元素的mar ...

  3. 网络接口配置--Bonding

    Bonding 就是讲到快网卡绑定到同一IP地址对外服务,可以实现高可用或者负载均衡.当然,直接给两块网卡设置同一IP地址是不可能的.通过bonding,虚拟一块网卡对外提供连接,物理网卡被修改为同一 ...

  4. Anaconda 安装 Python 库(MySQLdb)的方法

    [已解决]Anaconda 安装 Python 库(MySQLdb)的方法 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 201 ...

  5. 7系列高速收发器总结 GTP IP核使用篇

    上一篇7系列收发器博文讲解了GTP IP核的基本配置,本文继续分析如何将它使用起来.生成IP核后打开example design,先看看工程中包含的文件结构. 顶层文件下包含了gtp ip核系统顶层文 ...

  6. 多线程访问DataTable

    项目中需要读取数据库中的多张表.由于表的数据比较多,串行读取时耗时比较多,所以对程序做了一点优化. 环境 .NET 3.5,SQL Server 2012,Visual Studio 2015 过程 ...

  7. Spring中事务管理

    spring事务管理两种方式 第一种 编程式事务管理(不用) 第二种 声明式事务管理 (1)      基于xml配置文件实现 (2)      基于注解实现 一:声明式事务管理(xml配置) 第一步 ...

  8. 阿里云盾SSL证书即将到期怎么办?

    如果你也像我一样用了一个有效期限1年的DV证书,颁发厂商:Symantec.那当这个证书快到期的时候要怎么更换证书呢?1.证书安装环境是IIS82.下载重新购买的免费证书,对新证书进行重新先发.3.证 ...

  9. java变量的作用域和基本数据类型转换

    1.变量的作用域 赋值运算符 变量名 = 表达式 列: a = (b+3)+(b-1) 表达式就是符号(如:加号,减号)与操作数(如:b,3)的组合 自动类型转换(隐式类型转换):从小类型到大类型可以 ...

  10. &lbrack;每天解决一问题系列 - 0007&rsqb; 如何创建Catalog并用其签名

    问题描述: 校验一组文件的完整性 解决方法: https://msdn.microsoft.com/en-us/library/windows/desktop/aa386967(v=vs.85).as ...