空指针赋值分区

  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 
#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开始分配,故空指针的区间范围有那么大。

上面的阐述如有问题,希望各位更正,谢谢。

转载:http://www.xuebuyuan.com/2214486.html

转载于:https://www.cnblogs.com/zys-simon/p/9220955.html

转载:Windows核心编程---空指针赋值分区相关推荐

  1. C++Windows核心编程读书笔记(转)

    http://www.makaidong.com/(马开东博客) 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的 ...

  2. [笔记]Windows核心编程《十三》windows内存体系结构

    系列文章目录 [笔记]Windows核心编程<一>错误处理.字符编码 [笔记]Windows核心编程<二>内核对象 [笔记]Windows核心编程<三>进程 [笔记 ...

  3. [C++]《Windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  4. 《windows核心编程系列》二谈谈ANSI和Unicode字符集

    第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...

  5. chHANDLE_DLGMSG(windows核心编程)讲解

    看完<Windows程序设计>后开始看<windows核心编程>, 结果看第一个案例的时候就很惊人的发现,Jeffery大牛的代码很深奥.乍一看好像没有包含<window ...

  6. 在应用程序中使用虚拟内存——Windows核心编程学习手札之十五

    在应用程序中使用虚拟内存 --Windows核心编程学习手札之十五 Windows提供了3种进行内存管理的方法: 1)  虚拟内存,最适合用来管理大量对象或结构数组: 2)  内存映射文件,最适合用来 ...

  7. 虚拟内存——Windows核心编程学习手札之十四

    虚拟内存 --Windows核心编程学习手札之十四 系统信息 有些操作系统的值是根据主机而定的,如页面大小.分配粒度大小等,这些值不用硬编码形式,进程初始化时应检索这些值以使用.函数GetSystem ...

  8. 最近打算学习windows核心编程

    唉 看了越来越多的代码 还是从基础学习 要看windows核心编程啦 呵呵 下个星期一就去接来看下 应该是不错的书 转载于:https://blog.51cto.com/suxiangjuner/14 ...

  9. Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)

    前沿 学习Windows核心编程是步入Windows编程殿堂的必经之路,2018年寒假重温了计算机操作系统知识,前阵子又过学习Windows程序设计方面的基础,正所谓打铁要乘热,所以我又入了Windo ...

最新文章

  1. 华为鸿蒙ai字幕,EMUI11一个值得吹爆的功能?AI字幕,支持翻译英日韩
  2. 划痕实验 迁移面积自动统计_从Jupyter迁移到合作实验室
  3. LeetCode 1244. 力扣排行榜(map+multiset)
  4. 此网址已被限制 此网址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求。
  5. 移动应用可以通过微信沟通接口连接公众号 微信涨粉多了一个新通道
  6. 【UML】协作图Collaboration diagram(交互图)(转)
  7. CSliderCtrl鼠标点击精确定位
  8. ICLR 审稿人:这篇论文在标签平滑和知识蒸馏的关系上取得了重大突破!
  9. mysql集群系统_轻松构建Mysql高可用集群系统
  10. LoudMiner:伪装在VST软件中的跨平台挖矿软件
  11. android虚拟摇杆
  12. 数学建模论文常用LaTeX代码(2021美赛)
  13. 原子操作:CAS、TAS、TTAS、FAA浅析
  14. 在vue中使用wow动画插件(下载,配置,使用,参数)
  15. regedit是什么意思_regedit是什么意思?
  16. Android 9.0 去除锁屏界面及SystemUI无sim卡拨打紧急电话控件显示功能实现
  17. July大神交大读书会子atoi
  18. JavaScript的数学计算库:decimal.js
  19. 电子科技大学清水河校区不看会后悔的绝美秋季风景高清大图:如果你喜欢山水画,你一定会喜欢这里,因为这里就是山水画。
  20. 故宫景点功课18:内廷西路(下)

热门文章

  1. 点击打印出现IE已经阻止此站点用不安全方式使用 ActiveX 控件解决方
  2. Android 实现多个输入框的对话框
  3. sql的limit用法
  4. php5.6non thread safe 区别,PHP版本Non Thread Safe和Thread Safe如何选择?区别是什么?
  5. win7 没有microsoft print to pdf_现在还能不能下载到正版WIN 7
  6. python 最小硬币数_Python之动态规划(最少硬币数找零)
  7. 5学习周报_你做好周报的“闭环管理”了吗?——“周报管理知多少”
  8. HTML怎么限制每行字数,JS实现每行固定字数,自动换行
  9. 连接maven_Maven系列——超简单入门级教程
  10. oracle where in优化,【求助】为什么在where过滤条件中使用in这样子查询后速度变的非常慢?!...