Chinaunix首页 | 论坛 | 博客
  • 博客访问: 934839
  • 博文数量: 63
  • 博客积分: 568
  • 博客等级: 中士
  • 技术积分: 3435
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-05 11:44
文章分类
文章存档

2016年(4)

2015年(6)

2014年(3)

2013年(27)

2012年(23)

分类: C/C++

2015-12-22 23:54:41

我们先看一张图片,大家也许很熟悉,这是一个空指针错误。但是有一个疑问不知道大家有没有觉察到。
异常的地址是“dereference at 0000000000000160”, 这个地址是0x160的一个地址。对于一般的情况如果是
char *pointer = NULL
*pointer = ‘c’
这个发生异常必定无疑,但是如果是
char *pointer = (char *)0x160;
*pointer = 'c';
这样的代码看起来更像是野指针问题,怎么就一定会发生NULL pointer的异常呢?

其实这个问题涉及到内核中page管理,对于虚拟地址空间,由于NULL地址是非法地址,在0地址虚拟地址的页表设置时,应该设置了保护,当用户访问NULL地址时,就会产生异常。但是,一个页表项映射的物理地址并不止一个地址,而是一个页表大小,很多平台上面是4K的大小,这就是说在0开始的一段地址空间都是非法地址(一般4K)。
阅读(2807) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~