免费注册 查看新帖 |

Chinaunix

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

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

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

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

因为 NULL 必须是通用类型的,所以 C 规定是 (void*)0 。C++ 中直接以 0 作为特殊值处理。

论坛徽章:
0
32 [报告]
发表于 2005-05-17 23:27 |只看该作者

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

我估计NULL应该是这样实现的,
首先应该保证 NULL所指向的内存,不在用户空间,而是在内核,
如果我们对空指针操作,就会引发一个中断,因为user没有权限
在内核空间操作,系统可能会中断该用户程序,报告segment fault
之类错误.  实现中可能是系统将整个虚地址空间分成用户和系统两部分,
NULL所对应的空间应该映射在内核空间,不知道理解对不?

论坛徽章:
0
33 [报告]
发表于 2005-05-18 00:41 |只看该作者

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

虚拟内存是有权限控制的。0x0 这个位置是规定了不可读写,因此试图读写的时候必然引发 Access Volitation
qunying 该用户已被删除
34 [报告]
发表于 2005-05-18 00:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

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

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

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

扯远一点,C++ 98..........


忍不住说上一句,标准和实现往往是两回事,
如果写代码的时候把NULL和0混用,
恐怕会吃亏的。
尤其是做kernel和嵌入式系统的程序员。

论坛徽章:
0
36 [报告]
发表于 2005-05-18 15:33 |只看该作者

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

原帖由 "Solaris12" 发表:


忍不住说上一句,标准和实现往往是两回事,
如果写代码的时候把NULL和0混用,
恐怕会吃亏的。
尤其是做kernel和嵌入式系统的程序员。


哪我该怎么办?用 0 还是用 NULL。

如果一个实现修改了0 的含义(注意这时它不能称为一个c 编译系统),if (p) 这种写法可能会完蛋,但如果另一个实现修改了  NULL 的含义, if(p == NULL) 也会完蛋的。


我觉得只要按标准写就行了,出了问题不是还有手册吗? 改就是了。

论坛徽章:
0
37 [报告]
发表于 2005-05-18 19:20 |只看该作者

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

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

应该没有这样的规定吧?

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

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

win_hate qunying xiaoming FH 的看法我都赞同.

FH 对 qunying 有一次误会。

to FH:
唯一不甚明了的一点就是
if ( !ptr )
这种写法应该是正确的吧?

我发现大家争论的原因所在了:都是语言表达不清惹的祸
现在拨号,就不说了。
明天写个总结。

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

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

哎,把原理说出来,反而说我混淆是非。。。
计算机说白了就是数学。NULL只不过是数学概念的计算机表示(represent)
有否想过何为NULL?它表示什么?为何要定义为0而不是-1,-2。。?
java的NULL是数字0吗?SQL的NULL是数字0吗?其他类似语言的概念表示是怎样?
怎么都只看ansi C的表象认为NULL就是0呢?
只有了解了NULL的本质,才不会问出“空指针究竟指向了内存的哪个地方
”这样的问题。
借用对象概念:NULL就是一个数学类,#define NULL 0 只是一个C++语言的NULL的实例化(instance),#define NULL (vois*)0 又是C语言的实例化,SQL的NULL实例化为另外一个。。等等,ni不能说NULL就是0,也不能说0就是NULL。

概念已说明,多说无益,各位继续。。

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

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

原帖由 "kernelxu" 发表:
是说明p为一个空指针。NULL在"stdio.h"中被宏定义为0(或其他什么常数〈视编译器而定〉),而这样又并不是说p指向的地址为0,那么各位大侠,这时p究竟指在哪儿呢?不会就这么悬着吧?!

望高手告知其中的细节。不..........


在MEM中有个地址转换表!空指针指向一个内核保留的只读地址!由MEM(内存管理)完成映射
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP