空指针赋值分区
2008-12-06 12:58
176 查看
为什么通过空指针读写的时候就会出现异常?
除了NULL表示空指针,是否还有其他的值也是空指针?
如果还有其他的值,你们这些表示空指针的值都是什么?为什么?
首先解答第一个问题,在windows核心编程第四版的windows的内存结构一章中,表13-1有提到NULL指针分配的分区。其范围是从0x00000000到0x0000FFFF。这段空间是空闲的,对于空闲的空间而言,没有相应的物理存储器与之相对应,所以对这段空间来说,任何读写操作都是会引起异常的。
有了上面的解答后,第二个问题就很容易解答了。NULL的定义出现以下几个地方:
stdio.h文件中
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
ios.h文件中
#ifndef NULL
#define NULL 0
#endif
windef.h文件中
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可见,NULL的值,基本上是用0来表示的,是不是只能用0呢?在windows xp sp2的系统平台下,如果执行下面代码也是会发生异常的:
int * pAddr = (int *)0x0000ffff;
*pAddr = 1;
而下面的代码是不会出问题的:
int * pAddr = (int *)0x00010000;
*pAddr = 1;
为什么呢?在windows xp sp2下发现0x00000000到0x0000FFFF是空闲区间,而0x00010000所处的是进程的私有区间。我想第二个问题应该已经解决了,我想,空指针是程序无论在何时都没有物理存储器与之对应的地址。为了保障“无论何时”这个条件,需要人为划分一个空指针的区域,固有上面NULL指针分区。
在第二个问题的基础上,要解答NULL指针的范围,那就相对来说容易了,对于在32位x86计算机上运行的windows xp sp2来说,就是从0x00000000到0x0000ffff。为什么分配如此大的空间?而在定义NULL的时候,只使用了 0x00000000这么一个值,这不是浪费吗?我想,这是操作系统地址空间的分配粒度相关的,windows xp sp2的分配粒度是64KB,为了达到对齐,空间地址需要从0x00010000开始分配,故空指针的区间范围有那么大。
上面的阐述如有问题,希望各位更正,谢谢。
除了NULL表示空指针,是否还有其他的值也是空指针?
如果还有其他的值,你们这些表示空指针的值都是什么?为什么?
首先解答第一个问题,在windows核心编程第四版的windows的内存结构一章中,表13-1有提到NULL指针分配的分区。其范围是从0x00000000到0x0000FFFF。这段空间是空闲的,对于空闲的空间而言,没有相应的物理存储器与之相对应,所以对这段空间来说,任何读写操作都是会引起异常的。
有了上面的解答后,第二个问题就很容易解答了。NULL的定义出现以下几个地方:
stdio.h文件中
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
ios.h文件中
#ifndef NULL
#define NULL 0
#endif
windef.h文件中
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可见,NULL的值,基本上是用0来表示的,是不是只能用0呢?在windows xp sp2的系统平台下,如果执行下面代码也是会发生异常的:
int * pAddr = (int *)0x0000ffff;
*pAddr = 1;
而下面的代码是不会出问题的:
int * pAddr = (int *)0x00010000;
*pAddr = 1;
为什么呢?在windows xp sp2下发现0x00000000到0x0000FFFF是空闲区间,而0x00010000所处的是进程的私有区间。我想第二个问题应该已经解决了,我想,空指针是程序无论在何时都没有物理存储器与之对应的地址。为了保障“无论何时”这个条件,需要人为划分一个空指针的区域,固有上面NULL指针分区。
在第二个问题的基础上,要解答NULL指针的范围,那就相对来说容易了,对于在32位x86计算机上运行的windows xp sp2来说,就是从0x00000000到0x0000ffff。为什么分配如此大的空间?而在定义NULL的时候,只使用了 0x00000000这么一个值,这不是浪费吗?我想,这是操作系统地址空间的分配粒度相关的,windows xp sp2的分配粒度是64KB,为了达到对齐,空间地址需要从0x00010000开始分配,故空指针的区间范围有那么大。
上面的阐述如有问题,希望各位更正,谢谢。
相关文章推荐
- 空指针赋值分区(转)
- 空指针赋值分区
- 空指针赋值分区
- 空指针赋值分区
- 赋值构造函数的用法即指针悬挂问题的产生和解决(中)——解决之道
- 如何理解字符串赋值给指针与数组的区别
- 指针的传参数与赋值问题
- c++将临时对象赋值给引用和指针的不同
- [笔试题 2][c/c++]关于指针直接赋值问题
- [笔试题 2][c/c++]关于指针直接赋值问题
- const修饰的双重指针赋值解惑
- 解决gcc提示:从不兼容的指针类型赋值 从不兼容的指针类型初始化
- C语言指针的初始化和赋值
- 二维指针赋值和取值
- 详解C++-(=)赋值操作符、智能指针编写
- C++指针之间的赋值与转换规则总结
- 低级错误,野指针赋值
- 【C++】使用局部变量赋值而非引用,导致内存多次释放的野指针问题
- 完成strcpy函数的功能//传入的指针可以使用数组的方式赋值
- 再论C语言指针、地址、赋值的问题,又是一通“扯”