免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
51 [报告]
发表于 2005-05-25 14:52 |只看该作者

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

[quote]原帖由 "bonnytan"]许多程序设计风格的意见只是意见。通常卷入 ``风格战争" 是毫无意义的。某些问题 争辩的双方是不可能同意, 认同对方的不同或者是停止争论的。此为引用http://c-faq-chn.sourceforge.net/ccfaq/node286.html#q:17.10[/quote 发表:

这不是一个风格战争。

BTW:拜托所有清完嗓子准备发言的朋友,先喝杯茶然后将别人的发言都看一遍,
不要断章取义。

论坛徽章:
0
52 [报告]
发表于 2005-05-25 15:53 |只看该作者

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

建议不要在这里谈论风格问题,风格都是公司规定的。

现实生活中,null就是无、啥也没有的意思,可以向少林寺方丈请教一下。

在C语言中,NULL(stddef.h里定义为大写)表示一个无效的指针,但总要具体实现吧。所以许多实现将其定义为(void *)0,stddef.h里就是这样定义的,有些也定义为0,两者在具体用到的时候效果一样。NULL表示无效指针,但它不是无,因为它有自己的值。
你可以改变NULL的定义,例如你可以重新定义
#ifdef NULL
#undef NULL
#endif
#define NULL (void *)1
也就是说,系统规定的无效地址可能跟你定义的无效地址不一致,这时你的无效可能真的就无效了。

最后回答一下楼主的问题:
p指向了一个被定义为无效的地址。

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

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

学到知识了。

论坛徽章:
0
54 [报告]
发表于 2005-05-25 21:02 |只看该作者

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

我的一点理解加上刚才做的一个小实验,说出来请大家指点:

1,int * p;
    当declare一个指针的时候(非函数指针),我在redhat9自带的gcc上看到的是编译器申请了一个空间,然后赋 $0,我没有明白这个 $0到底是代表了 $0 还是 NULL(in stdio.h)。
2,if(p) if(!p)
     if()中出现的只能是逻辑变量,true or false,其实p经历了两次转换(cast):第一次转化为int,第二次转换是 (int)0 == false,
     if(p)这样的写法建立在两个假设的基础之上的:第一,NULL宏被定义为 (void*)0,第二,计算机只有0,1,没有true,false,第二个假设就是false用0表示,而不是-1(我记得以前学习的时候遇到过这样的表示法)
3,NULL
      NULL表示的逻辑意义并不是 0(指针),而是指向内容不确定(指针)

个人觉得,无论规范怎么定义,if( NULL == p)要优于 if(p),后者除了习惯,几十年来c程序员中的习惯(不可否认习惯是程序的一部分),我看不出任何额外的益处。

当然,在林锐的书上这么写,要用 if( p) 而不是 if( NULL == p),面试的时候我也会告诉面试官 if(p),毕竟这样更c style一点。 :em11:

哎。

论坛徽章:
0
55 [报告]
发表于 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 使程序崩溃 。

论坛徽章:
0
56 [报告]
发表于 2005-05-25 22:35 |只看该作者

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

个人觉得:
if( p )  不等于 if( NULL != p)
因为有两种情况:
1,ansi c的enhance(升级?)。
2,某些标准和ansi c的不一致,比如 posix和ansi c的某些不一致。
唯一能确定的是,有这么一个NULL存在,或者说NULL是定义,(void *)0是实现。

软件世界中没有none的概念, NULL想表达的是不确定而不是没有,就像 NULL != NULL一样。

恩,可能上面我的回复让人误解了。我想说的是这个。

ps:
       我找了半天没有找到ansi c,该怎么找,请教下。

论坛徽章:
0
57 [报告]
发表于 2005-05-25 22:58 |只看该作者

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

特别是http://c-faq-chn.sourceforge.net/ccfaq/node69.html
这本书叫什么名字啊
老大

论坛徽章:
0
58 [报告]
发表于 2005-05-26 01:30 |只看该作者

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

坚决认为赋null而不是0,虽然c定义了null的值为0。具体为什么,我想听听谭老师的解释吧
“指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:p=null,实际上null是整数0,它使p的存储单元中所有二进位均为0,也就是使p指向地址为0的单元。系统保证使改单元不做他用(不存放有效数据),即有效数据的指针不指向0单元。实际上是先定义null,即:#define null  0.........p=null;  在<stdio.h>;头文件中就有以上null的定义,它是一个符号常量,人们习惯上不用"p=0;"而是用"p=null;",这样可读性比较好”
原文!!!

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

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

原帖由 "huang0610" 发表:
坚决认为赋null而不是0,虽然c定义了null的值为0。具体为什么,我想听听谭老师的解释吧
“指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:p=null,实际上null是整数0,它使p的存储单元中所有二进..........

老兄,说几点:
1、是NULL不是null
2、牛人说的不一定完全正确,可能有些系统0地址不写有效数据,但并不是说所有的系统0地址都不写有效数据,特别是在嵌入式系统中系统会榨干每一个bit的内存。
3、同意win_hate老大

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

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

[quote]原帖由 "kernelxu" 发表:

老兄,说几点:
1、是NULL不是null
2、牛人说的不一定完全正确,可能有些系统0地址不写有效数据,但并不是说所有的系统0地址都不写有效数据,特别是在嵌入式系统中系统会榨干每一个bit的内存。
3、同意win_hate
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP