何为指针(三)空指针

Pointers or C 英文版翻译

原文:6.6 The Null Pointer

6.6 空指针


C标准定义了一个NULL指针,其值不指向任何东西的。为了使一个指针变量为UNLL,你把0赋值给它;为了测试指针是否为NULL,你把它和0比较。选择0值是源码约定,在内部,空指针的值实际是上可能有些不同。在这种情况下,编译器负责把0翻译为内部的值。


空指针的概念是十分安全的,因为它给了你指定了一种当前不指向任何东西的指针。例如:
有一个函数,功能是在一个数组中搜索一个特定的值,可能被找到,返回一个指向数组元素的指针。如果在数组中没有元素包含正确的值,可以用NULL指针代替它被返回。这中技术允许返回值传达两个方面的信息。一是,元素是否被找到?二是,如果元素被找到,被找到的是那个元素?


虽然这项技术在C程序中广泛的使用,但是它违反了软件设计的原理。一个值有两个意思是危险的,因为之后很容易混淆他原先真实的意思。这个问题在大的程序中更加严重,因为不可能一下子把所有设计放进你脑子里。一个安全的策略是让函数返回两个不相关的值:第一个是表示操作结果的状态值,第二个是一个指针,它仅仅在状态表示被匹配找到时被使用。


解引用一个指针,你会得到一个指针指向的值。但是NULL指针被定义为不指向任何值。因此,解引用一个空指针是非法的。在解引用之前,你必须确保他不是空指针。


如果间接执行一个NULL指针会发生什么呢?结果依赖与具体的实现。在一些机器上,间接存取内存的0位置。编译器不保证在0位置没有任何变量,但是机器没有阻止你读取或者修改这个位置。发生这个行为是非常不幸的,因为程序包含这一个错误,但是机器隐藏了这个情况,所以使错误很难被发现。


在另外一些机器上,间接使用NULL指针会造成终止程序的错误。提示错误被发现比隐藏它要好太多,因为程序员可以更加容易的改正这个错误。


如果所有的指针都可以自动的初始化为NULL就好了,但是不是这样的,只有在静态内存中的才可以。不管你的机器怎么操控解引用一个NULL指针,把你的指针全部都显式的初始化为NULL是可好的想法。如果知道期望的地址,那么使用他,否则用NULL初始化他们。好的程序员会在解引用指针之前先判断指针。这种初始化可以给你节约很多调试代码的时间。


译者:小风code
时间:2017-11-5

猜你喜欢

转载自blog.csdn.net/qq_33775402/article/details/78453513