免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 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作为空指针初始化以及判断的标准。

愿上帝与你同在,阿门!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
22 [报告]
发表于 2005-05-16 19:40 |只看该作者

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

宏定义是个约定,如果谁都可以随便推翻这些约定的话,那还有什么语言?

论坛徽章:
0
23 [报告]
发表于 2005-05-16 20:25 |只看该作者

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

NULL指针的值一定是0,这点可参照C语言标准。以下来自C99(WG14/N843 199
       [#3] An integer constant expression with  the  value  0,  or
       such  an  expression  cast  to type void *, is called a null
       pointer constant.46)  If a null pointer constant is assigned
       to or compared for equality to a pointer,  the  constant  is
       converted to a pointer of that type.  Such a pointer, called
       a null pointer,  is  guaranteed  to  compare  unequal  to  a
       pointer to any object or function.

.....
       46)The macro NULL is defined in <stddef.h>; as a null pointer
          constant; see 7.17.

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

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
24 [报告]
发表于 2005-05-16 21:56 |只看该作者

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

no,no,no
NULL只是一个表示“空”“无”的概念,可是计算机不能用一个"实物"来表示“空”“无”等概念,所以只有借助辅助的手段。最常用的,而且数学中表示这个概念的,也就是0了。可是0在计算机里面一些场合却又表示一个实际存在的东西,也就是说要一个实际存在的实体表示一个概念,这个似乎有些矛盾。怎么办?那么只能由编译器来解决,在上下文环境中来判断0应该是什么东西。比如在指针环境里,就把0当成“空”这样一个概念,在其他比如数值环境里面,就把0当成实数0。
而如果错误是用NULL,(在C语言里面也就是实数0,此时0有两种含义),当然会造成错误。

至于NULL是不是0,答案是不一定。因为NULL表示概念,0却可以表示实数0。所以在数据库中,NULL就不是用0表示(这句话是我上学的时候从老师那里听来的)

notice,NULL is just a conception not a real number!
qunying 该用户已被删除
25 [报告]
发表于 2005-05-17 02:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
26 [报告]
发表于 2005-05-17 08:44 |只看该作者

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

原帖由 "FH" 发表:


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


^_^,9494,可就是还有很多人推荐,唉,看起来像那么回事而已。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
27 [报告]
发表于 2005-05-17 08:56 |只看该作者

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

^_^,大家说的都是一回事啊。

FH可能做的是嵌入式部分,经常要自己实现C标准,所以,必须要了解到NULL是“空”的概念,而不一定是0地址。

而一般情况下,对0的上下文发翻译(是否翻译成0地址),可以由编译器去做。所以,上了一个层次,就可以简单的认为NULL的值就是0了,这也就是标准中说的这个意思。

风格建议上,还是尽量多使用if(p == NULL)这样的写法,毕竟,这更加靠近本质。

论坛徽章:
0
28 [报告]
发表于 2005-05-17 11:30 |只看该作者

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

说到空,就想到了空即是色,色即是空了.题外了.
对于返回,还是以NULL为主了,对于标准函数的返回指针也明确是返回NULL(意思),不必强行在是不是等于零上下功夫.
毕竟不要跳过宏定义去划等号.

论坛徽章:
0
29 [报告]
发表于 2005-05-17 18:22 |只看该作者

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

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

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

论坛徽章:
0
30 [报告]
发表于 2005-05-17 20:29 |只看该作者

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

原帖由 "keenor" 发表:

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

这个,标准有说“NULL指针的值一定是0”吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP