免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kernelxu
打印 上一主题 下一主题

空指针究竟指向了内存的哪个地方? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2005-05-17 18:22 |显示全部楼层

空指针究竟指向了内存的哪个地方?

C 中 NULL 表示为 (void*)0,并且可以用 if ( p ) 和 if ( !p ) 来判断一个指针是否为空,好像是在 TCPL 中规定的通用方法。规定 NULL 为别的什么东西,就像规定 strcmp 为复制字符串一样可笑。

扯远一点,C++ 98 标准中规定空指针就是 0,甚至不用 NULL 这个宏或者 (void*) 0 这种类型修饰符。

论坛徽章:
0
2 [报告]
发表于 2005-05-17 20:39 |显示全部楼层

空指针究竟指向了内存的哪个地方?

因为 NULL 必须是通用类型的,所以 C 规定是 (void*)0 。C++ 中直接以 0 作为特殊值处理。

论坛徽章:
0
3 [报告]
发表于 2005-05-18 00:41 |显示全部楼层

空指针究竟指向了内存的哪个地方?

虚拟内存是有权限控制的。0x0 这个位置是规定了不可读写,因此试图读写的时候必然引发 Access Volitation

论坛徽章:
0
4 [报告]
发表于 2005-05-26 16:10 |显示全部楼层

空指针究竟指向了内存的哪个地方?

在 TCPL 第二版中文版中 5.4 节地址算术运算 中有这样一句 (p86 line4)
C 语言保证 0 不是数据的有效地址

还有下面 line6-7
指针与整数不能相互转换,但0例外:常量0可以赋给指针……程序中经常使用符号常量NULL代替常量0,这样有助于更清楚地记住常量0是指针的一个特殊值


根据这个说法,特殊的是0,而不是NULL:NULL只是常量0的一个助记符。不用说什么“某些平台不以0为特殊值”云云;如果要说,请给出明确的例证。否则,我还是更倾向于相信 Denies Ritchie 和 Brian Kernighan 在书中的断言。

ps,很奇怪的是,我在附录A中没有找到可以印证这个说法的条款。谁有 TCPL 第二版新版或者 C99 标准文档的,可以看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP