Windows的空指针赋值分区
来源:互联网 发布:红色警戒 for mac 编辑:程序博客网 时间:2024/06/07 03:20
1.为什么通过空指针读写的时候就会出现异常? 2.除了NULL表示空指针,是否还有其他的值也是空指针? 3.如果还有其他的值,你们这些表示空指针的值都是什么?为什么? 首先解答第一个问题,在windows核心编程第五版的windows的内存体系结构一章中,表13-1有提到NULL指针分配的分区。其范围是从0x00000000到0x0000FFFF。这段空间是空闲的,对于空闲的空间而言,没有相应的物理存储器与之相对应,所以对这段空间来说,任何读写操作都是会引起异常的。有了上面的解答后,第二个问题就很容易解答了。NULL的定义出现以下几个地方:stdio.h文件中#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endifios.h文件中#ifndef NULL #define NULL 0 #endifwindef.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开始分配,故空指针的区间范围有那么大。上面的阐述如有问题,希望各位更正,谢谢。
- Windows的空指针赋值分区
- 空指针赋值分区
- 空指针赋值分区
- 空指针赋值分区
- Windows核心编程——》空指针赋值分区
- 空指针赋值分区(转)
- 对象赋值空指针
- 对空指针赋值的问题 指针的指针 指针的指针和指针数组
- 指针,野指针,空指针,赋值?
- 空指针赋值问题(树的非递归遍历)
- 指针指向空字符串和指针赋值为NULL的区别
- 指针删除后赋值为空
- 空指针在主函数中被赋值与在调用函数中被赋值的差别
- 记一次子线程赋值引起的空指针错误(NullPonitException)
- 空指针操作在linux和windows下的区别
- matlab 空数组的赋值
- 指针的赋值问题
- 指针的赋值
- C++ 再学习。。。编写高效安全的C++程序
- C#中的params关键字
- 牛人blog
- 存储引擎揭秘:基本结构之四——IAM页,IAM链和存储单元
- 使div浮动层显示在Select组件上面
- Windows的空指针赋值分区
- XML的基础和DOCTYPE字段的解析
- From IBM -- 从黑箱到企业: JMX 集成动手实践
- 内存大小端、指针实际应用题分析
- SAP HR 工资核算异常的一些处理方式
- 关于datacall
- c# 代码 添加或删除程序开机启动
- 文件夹加密(转)
- [ASP]无限级分类的简单算法实现及代码重点讲解