免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
101 [报告]
发表于 2007-08-03 15:37 |只看该作者
学习了,向各位版主致敬!

论坛徽章:
0
102 [报告]
发表于 2007-08-08 09:34 |只看该作者
NULL不一定是0!这句话是俺今天第二次说。
NULL只是一个概念,叫作空值,其值本身没有任何含义,可以用0代替,也可以用1,...代替,只要这些值不会与系统实际的有效地址冲突即可。
因此,本人在此再次强调,不要自作聪明地认为NULL就是0,要判断的时候还是老老实实地与NULL做比较,别想当然地用什么!ptr之类的写法,因为在某个特定环境下,NULL可能不是0,而系统函数返回的是NULL不是0,那时,你的函数就会出现莫名其妙的错误。所以,养成良好的习惯是非常重要的。
忘了是谁第一个用了!ptr这样的写法,这个人该杀!害了多少人啊!


不知道C的标准如何。

至少NULL这个概念根本就不符合C++标准,C++没有NULL这个类型,某些库或者IDE支持NULL,说白了NULL其实是一个(void*)0这么一个宏而已。

if(!ptr) {} 这种用法,C++之父Stroustrup在他的书里面频繁的使用。

至少参考Stroustrup的 The C++ Programming Language。

参考见Stroustrup的FAQ,有关NULL的章节:http://www.research.att.com/~bs/bs_faq2.html#null

Stroustrup还给出了如下解释:

In C, it has been popular to define a macro NULL to represent the zero pointer. Because of C++’s tighter type checking, the use of plain 0, rather than any suggested NULL macro, leads to fewer problems. If you feel you must define NULL, use const int NULL = 0;
The const qualifier prevents accidental redefinition  the NULL and ensures that NULL can be used where a constant is required.

C++之父不提倡定义一个红,他宁愿定义一个const int NULL = 0;的常量。

[ 本帖最后由 leeon868 于 2007-8-8 09:43 编辑 ]

论坛徽章:
0
103 [报告]
发表于 2007-08-08 09:45 |只看该作者
所谓空指针就是不指向任何地方。

论坛徽章:
0
104 [报告]
发表于 2007-08-08 10:30 |只看该作者
我看了那么多帖也没有人解释LZ的题面。跑题跑到了NULL和0比较的这个概念。跑题严重。

楼主在问:
是说明p为一个空指针。NULL在"stdio.h"中被宏定义为0(或其他什么常数〈视编译器而定〉),而这样又并不是说p指向的地址为0,那么各位大侠,

那么各位大侠,这时p究竟指在哪儿呢?不会就这么悬着吧?!

望高手告知其中的细节。不胜感激!!

指针到底指向了哪里?

这里先说一个概念,何谓指针。我推荐看这么一本书《C和指针》英文名叫《Pointers On C》。
BTW:其实我认为《C和指针》这个名字翻译的不是很好,Pointers是双关语,1、指针。2、要点。这是本好书,极力推荐。

在汇编语言内,没有“指针”这个概念,统统都是数。

指针就是一个概念,本质其实就是一个整数,符合操作系统的长度,32位的系统就是32位的,64位的系统就是64位的。

一个变量有两个概念,就是值和地址,好比“我”这个概念,我本人的值当然是我,可是我的实际所在地是上海。要想找到我,就定义一个“地址”这么个指针。就会得到上海,而地址这个变量就是个指针。

一个指针保存的就是变量实际在内存中的物理地址。只要是变量就会有地址,就是这个这个指针p也有物理地址。

回头再看NULL,下面摘自金山词霸:

null
adj.
无效力的, 无效的, 无价值的, 等于零的
n.
零, 空, 零迅号

NULL并不一定就是名词含义:0,还形容词含义,无效的。

上面的帖子有人说得好,NULL就是引入的一个概念。

为什么要使用一个NULL这个宏呢?

其实有两个原因,或者还有其他的,我所接触的就这两个。

其一,就是不使用“魔”数(magic number),这是一个C/C++惯用法,不随便把数字定义写入代码。if (p == 0)这种写法是“可憎恶”的。解决方法就是把0定义为一个宏或者常量。而if(!p)才是C++之父提倡的。
BTW:还有一个“可憎恶”的用法就是int fun(void){ return 0 }。这个函数参数里面的“可憎的void”,已经被C++之父Stroustrup还有C++社区的人们痛恨,参见Stroustrup《D&E C++》。

其二,就是编译器支持的调试。微软的cl编译器调试状态下会把内存地址初始化为0xcccccccc。我曾经遇到过一个编译器,会在DEBUG模式下,把NULL定义为某个特定的断言地址,用来进一步调试,而不是单纯的出错,RELEASE状态下会用0。这样以来就不会手动去写那些assert了。这里的NULL作为调试宏出现。各种类型的库,支持各种类型的断言,有些人写自己的断言来用。

最后解释,这个p到底指向哪了?很简单,就是指向NULL所指向的值,NULL定义了什么内容,就指向那个内容,指向哪取决于库甚至编译器的定义。

在通常的情况下,NULL的定义都会符合英文“无效”这个概念去定义,要是有效还要这个英文单词干吗?

在NULL这个“无效”的概念下。如果int* p = NULL; p的值没有做修改,程序就一直认为是“无效”的,用"*" 操作符使用其内容会说无效地址的错误。

[ 本帖最后由 leeon868 于 2007-8-8 10:42 编辑 ]

论坛徽章:
0
105 [报告]
发表于 2007-08-08 10:59 |只看该作者

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

空指针为系统保留,不必钻研空指针指向了内存的哪个地方,没有意义,只要知道空指针的作用即可。

论坛徽章:
0
106 [报告]
发表于 2007-10-05 17:17 |只看该作者
分析的好,学习了!!DING

论坛徽章:
0
107 [报告]
发表于 2007-10-05 18:48 |只看该作者
原帖由 FH 于 2005-5-13 17:25 发表
NULL不一定是0!这句话是俺今天第二次说。
NULL只是一个概念,叫作空值,其值本身没有任何含义,可以用0代替,也可以用1,...代替,只要这些值不会与系统实际的有效地址冲突即可。
因此,本人在此再次强调,不 ...

C++ Primer 的作者 Stanley Lippman (Visual C++ 首席架构师)包括 C++标准委员会现任主席也是这么推荐的。
对于 C++ 来讲 if(!p)是一种惯用法,但是对于 C来说不是。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP