免费注册 查看新帖 |

Chinaunix

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

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

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

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

原帖由 "FH" 发表:
NULL不一定是0!这句话是俺今天第二次说。
NULL只是一个概念,叫作空值,其值本身没有任何含义,可以用0代替,也可以用1,...代替,只要这些值不会与系统实际的有效地址冲突即可。
因此,本人在此再次强调,不要自?.........

我完全同意FH关于“NULL不一定是0”的观点。NULL本身就是一个宏。
#define NULL "FH"
#define NULL "abc"
#define NULL printf
...
这些都是合法的C/C++预处理语句。
正因为这点,所以,在我们比较指针是否为空的时候,一个更好的方法是把它和0比较。譬如说:
if ( str == 0 )
    abort();//传进来的字符串是空的,叫人怎么活?
这是因为如果你写
if ( str == NULL )
万一有某个好事之徒像FH说的那样把NULL定义成1、2、3、...了,那怎么办?(虽然这种人该杀)
因此,结论就是,推荐使用0作为空指针初始化以及判断的标准。

愿上帝与你同在,阿门!

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

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

原帖由 "keenor" 发表:

第一段说得很清楚,值一定是0,而类型可以是void *,也可以是int。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n843.htm

这个,标准有说“NULL指针的值一定是0”吗?

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

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

[quote]原帖由 "qunying"]NULL作为宏定义肯定是为零的. 这是标准C规定的[/quote 发表:

应该没有这样的规定吧?

论坛徽章:
0
4 [报告]
发表于 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
5 [报告]
发表于 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关于道德败坏的定义,但是标准只规定了某个政府部门不能道德败坏,并没有规定其它政府部门不能道德败坏......

_________________
愿耶稣基督、穆罕默德、释迦牟尼与你同在!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP