+ -
当前位置:首页 → 问答吧 → 纠结在空指针上

纠结在空指针上

时间:2011-12-13

来源:互联网

我们知道空指针就是没有指向任何对象的指针,这个是通过其值来判断的,即,赋值NULL
X *p = NULL;
NULL是一个宏,实际等于0,假设一个对象分配的地址刚好在0处呢?

作者: yusss   发布时间: 2011-12-13

这种情况是不会出现的,根据微机原理的知识,内存的前n个单元用来放的是中断向量,这些地址的访问由硬件完成;当然操作系统能够可以修改这些空间的值,但是用户程序是不可能用到的。

作者: nuaazdh   发布时间: 2011-12-13

有些地址是受保护的

作者: ouyh12345   发布时间: 2011-12-13


你咋怎么纠结呢~
X *p指的是给p的内存编号假设为0x1000,而给他如果赋值的话,是将那个值的内存地址赋予0x1000这个地方,而将p=NULL,的意思是给0x1000=NULL,NULL的值在很多情况下是0,它就指向了第0个编号的内存地址,此时,这个指针和所指向的内存单元是有意义的,但是,基本上所有的操作系统中,第0个字节的内存都是处于存放系统内核的区域内的,是不能让用户直接访问和读写的,所以,使用一个值为NULL的指针(即它指向第0字节的内存)会产生如:"XXX所引用的内存地址0X0000不能为READ"之类的错误.这个错误是操作系统的保护机制在起作用.
这也就是说NULL值不一定要定义成0,起始只要定义在系统的保护范围的地址空间内,比如定义成(0x00000001, 0x00000002)都会起到相同的作用,但是为了考虑到移植性,普遍定义为0 。

作者: hackhat   发布时间: 2011-12-13

建议你去看看操作系统的书,内存管理映射分页等等机制都在限制着你对内存的访问,做为一个应用程序,其实你对内存访问的地址都是映射地址,不是实际地址。很多情况下,0x00000000对应用程序来说,不光是不能访问,而且是根本就没有这个映射地址。

作者: feidaosh   发布时间: 2011-12-13

如果操作系统由你来写,你才可能为所欲为。

作者: pathuang68   发布时间: 2011-12-13