天天看点

C语言 野指针和空指针

​​空指针​​

问题思考:

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

​​野指针​​

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

指针变量未初始化

指针释放后未置空

指针操作超越变量作用域

如何规避野指针

初始化时置 null

释放时 置 null

空指针

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

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

如果对一个null指针间接访问会发生什么呢?

结果因编译器而异。

像vs就报错,像dev这种牛逼的编译器就没事。

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

运行上面的案例就会报错。

C语言 野指针和空指针

野指针

在使用指针时,要避免野指针的出现:

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

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

比如下面代码

虽然手动给出了地址,但是仍没有指向合法的内存

C语言 野指针和空指针

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

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

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

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

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

C语言 野指针和空指针

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

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

继续阅读