免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
61 [报告]
发表于 2005-05-26 11:27 |只看该作者

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

如果仅仅声明一个指针,而没有任何赋值,那么这个指针是野指针,它会指到VM的任何位置,碰到异常操作,比如对只读区写操作,就会引起硬件中断产生core,也就是通常的段错误。
良好的编程风格是将指针永远都可控,也就是这个指针的地址,程序可控,通常,对于不使用或初始的指针都将其地址置为0,这是约定俗成的,就如同,我们经常使用的进制一样,你非用一个别人都不用的进制表示数,那也随你,只是别人觉得怪而已。再比如,用free释放完指针后,相信大家都会将指针置成NULL或0,就是为了再使用这个指针时,便于判断。指针的地址为0,操作起来就非常方便,比较位操作等,都可对应到机器码,这也就体现了“高级汇编”的美誉。用NULL宏,仅仅是为了可读性,编译器会进行优化的。
对于将NULL定义成某个地址,然后进行比较,相对NULL为0地址,然后比较,性质是相同的,在执行过程中,如果重新定义的地址为可操作,可能会对程序的逻辑流程产生影响。

另,谭老师的书,还是少看,会误人子弟,他的理解都是dos年代的,适合用tc2.0编程,32位的OS上,很多提法是不对的。

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

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

aero老大说的即是!
请求将此贴设为精华?!
顶!

论坛徽章:
0
63 [报告]
发表于 2005-05-26 16:10 |只看该作者

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

在 TCPL 第二版中文版中 5.4 节地址算术运算 中有这样一句 (p86 line4)
C 语言保证 0 不是数据的有效地址

还有下面 line6-7
指针与整数不能相互转换,但0例外:常量0可以赋给指针……程序中经常使用符号常量NULL代替常量0,这样有助于更清楚地记住常量0是指针的一个特殊值


根据这个说法,特殊的是0,而不是NULL:NULL只是常量0的一个助记符。不用说什么“某些平台不以0为特殊值”云云;如果要说,请给出明确的例证。否则,我还是更倾向于相信 Denies Ritchie 和 Brian Kernighan 在书中的断言。

ps,很奇怪的是,我在附录A中没有找到可以印证这个说法的条款。谁有 TCPL 第二版新版或者 C99 标准文档的,可以看看。

论坛徽章:
0
64 [报告]
发表于 2005-05-31 17:06 |只看该作者

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

林锐的书没有说!ptr,只说了ptr==NULL和ptr!=NULL,别诬陷人家

论坛徽章:
0
65 [报告]
发表于 2005-06-02 17:31 |只看该作者

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

林锐那本垃圾书也有人看,笑话,那里面错误一大堆;
要看就看那些经典的书

论坛徽章:
0
66 [报告]
发表于 2005-06-04 14:16 |只看该作者

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

同意FH的看法。NULL并不一定是0,有些程序员想当然用!ptr去判断指针是否为
NULL。严格来说,这完全是一厢情愿的做法。在一些编译不严格的系统里面有可能能够编译通过,但是假如碰上相反的情况,我们又会去埋怨系统了。鄙人就碰上过类似的情况,最后把别人程序中的!ptr改成null完全搞定。所以说,养成良好的编程习惯,按照c语言的语法规则编写代码是解决类似问题的最好方法。

论坛徽章:
0
67 [报告]
发表于 2005-07-19 16:36 |只看该作者

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

这是一个哲学问题,在这里讨论不合适。

论坛徽章:
0
68 [报告]
发表于 2005-07-20 05:12 |只看该作者

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

as time goes on,
people think NULL == 0 is bad expression (in c)
so...
in Java We create a new nulltype, that is not a primitive type.
SirFang 该用户已被删除
69 [报告]
发表于 2005-07-20 10:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
70 [报告]
发表于 2005-07-20 14:34 |只看该作者

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

0 与 空(NULL) 在概念上是两码事

0 是实数,是一个实物数
空 概念上是无,不包括任何东西,当然也不包括0啦.

以上阐述的是概念上的问题,

实际上: 在代码中没有什么分别. 定义上已经将 0 定义为 NULL,
实际上也没必要分得那么细, 倒不如,实实在在的在代码算法等多思考

在 linux 及 windows 系统上编程不可能地避免使用它们的宏定义.
这属于编程风格上的问题.

typedef struct date {
        ......
       .....
} DATE;

DATE m_date1;

这样的代码风格,个人认为不好.

个人比较喜欢定义为:  struct date m_date1; 这样有利于理解变量本质..

而: char *p; p = NULL;

倒不如直接定义为: char *p = 0; 简单明了.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP