空指针操作,出错的本质是什么?

#Page# 2011-12-01 02:55:06
PC的有保护,可能是0地址不在用户态什么的,本质是?
而在嵌入式,0地址可能是CPU第一个运行的地址,读应该是没问题的,但写为什么出错?本质是什么?
我的本意:如何在写0地址出错时打印一些信息!别挂了还找半天~~~~
...全文
567 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
hejian1106 2012-12-31
  • 打赏
  • 举报
回复
至于为什么没有物理内存与这块内存建立映射,这是操作系统的原因。。。。你可以不用去管他,了解就行
hejian1106 2012-12-31
  • 打赏
  • 举报
回复
本质就是 没有物理内存映射到所指向的那块虚拟地址啊
#Page# 2012-11-14
  • 打赏
  • 举报
回复
都没有回答到本质,19楼说的还可以
robin97 2011-12-04
  • 打赏
  • 举报
回复
0地址,呵呵,可以访问的,你所说的那些情况,是由于没有建立页面映射以及特权级别限制造成,哪有访问不了的地方啊,限制你访问而已。
天云 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anyidan 的回复:]

本质 是享受自由的前提是必须受到 约束
[/Quote]

++
cao_julians 2011-12-03
  • 打赏
  • 举报
回复
研究问题应该有“层次”概念:
C语言实际上建立在一个抽象的层次上,它没有涉及某一个具体的硬件结构(C语言的宗旨之一就是通用--通用于任何计算机),对NULL而言,只是表示地址范围中的一个特殊点,它不可访问--表示无效地址。
至于它是不是0,0地址处是什么?这就要涉及到具体的计算机硬件结构了,这是另一个层次的问题了。
一个具体的编译器负责NULL与一个具体硬件结构地址的关联。没有记错的话,看看“C的495个问题”
windman521 2011-12-03
  • 打赏
  • 举报
回复
本质 就是你只能在自己家里胡作非为。OVER。
「已注销」 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zichen0422 的回复:]

NULL指针跟0地址是有区别的!
[/Quote]

请问:有什么区别?
dic_008 2011-12-02
  • 打赏
  • 举报
回复
0--64K这段内存就不能访问
wang0635 2011-12-02
  • 打赏
  • 举报
回复
空指针到底是什么地址,由编译器确定
源代码中可以写作 ( XXX *)0
「已注销」 2011-12-02
  • 打赏
  • 举报
回复
本质是保护模式的保护。
赵4老师 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao4zhong1 的回复:]
内存管理、虚存管理、缺页中断……
内存区段、CPU的段寄存器、区段的访问权限RWX、越权访问触发的中断……
[/Quote]
正解!(^_^)
zichen0422 2011-12-02
  • 打赏
  • 举报
回复
NULL指针跟0地址是有区别的!
bEst_02 2011-12-02
  • 打赏
  • 举报
回复
如果想查找异常的地方,使用异常处理函数就可以了。函数里面打印异常代码以及其他等
zhusizhi007 2011-12-02
  • 打赏
  • 举报
回复
只是一种预定义的错误状态,而0又是最好的备选,实际上,0地址是可以转化为函数指针的,在汇编里面。。
狂且 2011-12-02
  • 打赏
  • 举报
回复
这个地址是受操作系统保护的, 有的机器还特意加了硬件级的保护. 想写几乎是不可能的.

根据5 楼提示, 俺也去学习.
CoolEgos 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 demon__hunter 的回复:]

win32位每个进程的地址空间里,开始内存地址空间里设置了一个分区,范围是0x00000000~0x0000ffff,如果进程中有线程试图读写这段区域,cpu就会引发非法访问的。
[/Quote]嗯嗯
AnYidan 2011-12-01
  • 打赏
  • 举报
回复
本质 是享受自由的前提是必须受到 约束
catmonkeyxu 2011-12-01
  • 打赏
  • 举报
回复
每个进程的最前面一段地址,是完全不可访问的,不光是不能写,读也不可以
guzhijie1981 2011-12-01
  • 打赏
  • 举报
回复
楼主还是看看intel cpu的体系架构吧,还有就是OS原理,
另外空指针,未必表述指向0地址的指针,
还有就是,要知道地址在逻辑上是连续的,并不代表在实际上是连续的,比如说你的2片128m内存,他们可能占据了其实的128m和32bit地址最后的128m,何况很多概念上的地址是分配给其他硬件的。
我们无法确定0地址是否真正存在,所以我们更加无法知道空指针到底表示什么地址。

另外嵌入式的处理器,多数不是从0地址开始执行第一条指令的,这个和体系有关,而且现在多数的嵌入式处理器带linux操作系统 的,所以应用程序是有OS来管理的。空指针的问题,多数是OS来管理,
加载更多回复(5)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧