免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 41209 | 回复: 6
打印 上一主题 下一主题

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

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

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

空指针保证不是一个合法地址,这是标准规定的。

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

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

原帖由 "FH" 发表:


那说明他就该杀!他的书是垃圾!审稿的人也是饭桶!



上次有个谁来着,说那本书是 <<c/c++ 高质量笑话>;>;.

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

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

我对 if (p) 的看法:

1、(char *)0, (void *)0... 均为所谓的``零指针''

2、在指针上下文 0 会被提升为相应的 ``零指针'',其部表示取决于机器

3、if (p == 0) 是合法的

(p==0) 为指针类型与常数 0 比较,常数 0必须被提升,提升为相应类型的“零指针”(type *) 0

4、if(p) 也是合法的:
因为 if(p) 会被编译器处理为 if (p == 0),然后归结到 3

至于风格的问题,我就不讨论了。

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

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

原帖由 "Solaris12" 发表:


忍不住说上一句,标准和实现往往是两回事,
如果写代码的时候把NULL和0混用,
恐怕会吃亏的。
尤其是做kernel和嵌入式系统的程序员。


哪我该怎么办?用 0 还是用 NULL。

如果一个实现修改了0 的含义(注意这时它不能称为一个c 编译系统),if (p) 这种写法可能会完蛋,但如果另一个实现修改了  NULL 的含义, if(p == NULL) 也会完蛋的。


我觉得只要按标准写就行了,出了问题不是还有手册吗? 改就是了。

论坛徽章:
0
5 [报告]
发表于 2005-05-19 09:35 |显示全部楼层

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

我又把标准看了一下,发现很有趣的描述。


1、0, (void *0) 是零指针常数,用于指针比较时,不等于任何有意义的指针(指向合法位置的指针)。

2、NULL 被规定为: 实现指定的零指针常数,在 stddef.h 中定义。(没有说是否就一定为0。)

从这两点我们至少可以知道,按标准

if (!p), if (p==NULL) 都是合法的,如果遇到了不标准的实现,自认倒霉好了。


注意一点:NULL 是``实现定义的零指针常数''。
隐含如下的意思:NULL 不必为0,除了指定零指针常数外,具体实现还可以定义别的零指针常数。一个标准的编译器必须同时能支持这两种零指针常数,尽管它们可能是一样的。

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

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

我不懂C++  说得很对。

不过把NULL 定义为别的东西,虽然不能比拟为犯法,但定性为道德败坏绝对是没有问题的。

我把我前面贴子中的

NULL 规定为一个现实定义的零指针常数

改为:

ANSI C 标准中所提及的 NULL 是一个现实定义的零指针常数

这样总没有问题了。其实,我们前面所讨论的NULL,指的正是编译系统提供的NULL,而不是自己另外定义的。

ps. 法律也会有漏洞,标准也会有自相矛盾的地方。

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

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

请后继发贴者看清前面的贴子再接, 我把一些我认为正确的观点再写一下:

1、0 和 (viod *)0 是零指针常数
2、0 或 (void *)0 转换为 (type *)0 后,称为零指针
3、零指针与任何指向有效地址的指针比较一定不等
4、stddef.h 中有一个标准的宏 NULL,该宏被规定为 实现定义的零指针常数.

以上 4 条均是 ANSI C 标准的规定,一个符合 ANSI 标准的编译器必须支持它们。根据以上4条,if (p) 与 if (p != NULL) 等价。

感谢 我不懂C++ 兄, 他指出,标准并未规定:你不可以用自己定义的 NULL 去覆盖 stddef.h 中的 NULL, 所以用 if (P == NULL)  不好。

我同意此观点的根据,但不同意其结论。NULL 的作用在于 ``提示此为一指针'',是否用 NULL,是一个风格的问题。而且 NULL 的用法在 c 里已经是事实标准。

重定义 NULL 是很稀奇的事。如果你认为重定义一个宏没什么大不了,请注意 NULL 是一个 ANSI C 规定实现的标准宏。

重定义 NULL 与重定义标准库函数可以相提并论。与宏一样,函数库也并非语言的一部份,但 ANSI C 还是规定了一些标准库。没人可以禁止你实现自己的 printf,并覆盖 stdio 中的 printf,而你自己实现的 printf 可以调用一个 abort 使程序崩溃 。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP