免费注册 查看新帖 |

Chinaunix

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

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

qunying 该用户已被删除
41 [报告]
发表于 2005-05-19 01:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
42 [报告]
发表于 2005-05-19 09:16 |只看该作者

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

如果 “if(ptr) 和 if(ptr != NULL) ,”等价,
那么NULL就一定是(void*)0

论坛徽章:
0
43 [报告]
发表于 2005-05-19 09:35 |只看该作者

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

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


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

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

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

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


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

论坛徽章:
0
44 [报告]
发表于 2005-05-19 09:39 |只看该作者

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

原帖由 "ChinaDream" 发表:


在MEM中有个地址转换表!空指针指向一个内核保留的只读地址!由MEM(内存管理)完成映射


说到点子上,谢谢!

论坛徽章:
0
45 [报告]
发表于 2005-05-19 10:00 |只看该作者

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

学习

论坛徽章:
0
46 [报告]
发表于 2005-05-19 11:36 |只看该作者

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

to yuxh:
我很同意宏定义是一个约定,但是我想说的是,违反了宏定义,和语言本身并没有关系。宏定义虽然和语言有千丝万缕的关系,但是严格的说,还是在语言之外的。

to keenor以及后面的某些人:
我想指出你的一个小小的逻辑错误。你这两段话,只能说明,在stddef.h里面定义的NULL必须是那个null pointer constant。但是标准从来没有说过,如果我在另一个不相关的头文件里面定义一个NULL,并且定义为其它东西,就会不符合标准。虽然我承认那样做的可能性很小,但是逻辑上,我们不能用你的话得出这个推断。
这就好像如果在一本法典里面规定:
1.暴露行为:=裸体|方便
2.在公共场所有暴露行为,就是有伤风化罪
从这两条,我们不能判定出,在家里洗澡也有伤风化。

to qunying:
我承认一个人把NULL定义为其它东西,是给自己和别人找麻烦,但是我不同意这是违反标准的。理由同上。

有人可能会说,为什么不用宏呢?直接使用常量不是一个不好的习惯吗?问题在于,我们为什么用宏呢?我觉得宏有三个作用:助记/抽象,简化输入。NULL和0相比,简化输入是肯定不可能的。至于助记抽象的话,这就要看了。我们都看到过这样的宏:
#define PAGE_SIZE (32*1024)
有谁看到过这样的宏?
#define ONE_HUNDRED_AND_TEN (110)
前面的一个宏很好,它赋予数字更多的意义。后面的那个宏很烂,因为没有赋予什么意义。而现在ANSI的意思就是,大家就都把0认为是null吧,别再助记了。也就是说
#define NULL (0)
某种意义上说,和前面第二个宏差不多。

有人说,既然一般没毛病的,都会把NULL定义为0,那么我们也就这样用好了。但是这的确会偶然产生问题。譬如说:
https://lists.openafs.org/pipermail/openafs-devel/2002-March/007721.html
http://lists.gnu.org/archive/html/uisp-dev/2004-10/msg00008.html
既然他们可能出问题,别人也可能出。更不用说,我写一个测试程序来测试某个语法特性,如果不包含任何头文件,使用NULL就不会通过。

事实上,我也同意说,大多数情况下,NULL都会被定义为0,这个大多数情况甚至可能是99.99%。问题在于,既然直接使用0可以100%解决问题(我们不需要include任何头文件,不需要考虑是不是兼容,不需要考虑有什么恶心事件的发生),为什么我们不直接用0呢?

btw:我最讨厌三种人,会数数的和不会数数的
btw:“在MEM中有个地址转换表!空指针指向一个内核保留的只读地址!由MEM(内存管理)完成映射”,这没有踩到本质的点上。

论坛徽章:
0
47 [报告]
发表于 2005-05-19 11:51 |只看该作者

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

有谁可以给出C中空指针不用0地址的例子?

论坛徽章:
0
48 [报告]
发表于 2005-05-19 13:00 |只看该作者

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

我不懂C++  说得很对。

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

我把我前面贴子中的

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

改为:

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

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

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

论坛徽章:
0
49 [报告]
发表于 2005-05-19 20:03 |只看该作者

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

我不太能够指出C语言里面NULL不等于0的情况,因为我对C其实不很了解。
但是在C++里面,这肯定会是一个问题。这里的问题在于名字碰撞。C++倾向于尽量少用宏,而多用常量,这是因为常量的名字不会撞倒。
譬如说我写一个SQL模块,里面我想定义一些标志位:
namespace SQL
{
enum Flags
{
    NULL = 0,
    LOCK,
    ...
};
// other definitions omitted
}
那如果像现在这样,就会撞上,最终导致编译错误,所以我只能定义成:SQL_NULL。或许C语言里面这样做有理由,但是在C++里面,SQL::SQL_NULL就和CStudent::mStudentName一样,通常是不好的习惯。
当然,NULL不可能成为一个常量,否则编译错误会更多。
我想C++里面的新的关键字null之所以用小写,或许也考虑了一般人定义常量都是全大写(独家猜测)。
我同意win_hate关于道德败坏的定义,但是标准只规定了某个政府部门不能道德败坏,并没有规定其它政府部门不能道德败坏......

_________________
愿耶稣基督、穆罕默德、释迦牟尼与你同在!

论坛徽章:
0
50 [报告]
发表于 2005-05-25 14:39 |只看该作者

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

许多程序设计风格的意见只是意见。通常卷入 ``风格战争" 是毫无意义的。某些问题 争辩的双方是不可能同意, 认同对方的不同或者是停止争论的。此为引用http://c-faq-chn.sourceforge.net/ccfaq/node286.html#q:17.10
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP