关于C程序中空指针(null指针)的设计哲学

C语言里面的指针可以指向任何有效的数据,也可以
不指向任何东西;这后者即所谓的NULL指针。

当指向有效数据的时候,对它使用*做dereference操
作就可以取出数据来了;但是对不指向任何数据的指针
来进行*操作肯定就没什么意义了,对吧?所以对不指
向任何数据的指针做提领其实是个bug。

在现代的操作系统设计中,为了消除程序里面的这种
bug,故意分配一些专门的不能访问的内存页,然后
将NULL指针安排在里面。这样当程序员不小心在自己
的程序中写下对NULL指针的提领操作后,系统运行时
就会报错。

在windows和linux中,这些内存页被设计者安排在
0地址开始对应的那几个页上。实际上,这些页面里面
的任何地址都是不能被提领的。*((char *)0) 不可以,
*((char *)0x12)之类的地址也不可以。

很多人认为NULL指针其实就是指向0地址的指针,实际
上这是不准确的。虽然很少见,但也有处理器架构将
NULL指针安排在非零地址起始的页面内。所以为了程
序的可移植性,在需要使用NULL指针的时候,用NULL
宏而来不用0值来初始化指针变量。

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值