我们先看一张图片,大家也许很熟悉,这是一个空指针错误。但是有一个疑问不知道大家有没有觉察到。
异常的地址是“dereference at 0000000000000160”, 这个地址是0x160的一个地址。对于一般的情况如果是
char *pointer = NULL
*pointer = ‘c’
这个发生异常必定无疑,但是如果是
char *pointer = (char *)0x160;
*pointer = 'c';
这样的代码看起来更像是野指针问题,怎么就一定会发生NULL pointer的异常呢?
其实这个问题涉及到内核中page管理,对于虚拟地址空间,由于NULL地址是非法地址,在0地址虚拟地址的页表设置时,应该设置了保护,当用户访问NULL地址时,就会产生异常。但是,一个页表项映射的物理地址并不止一个地址,而是一个页表大小,很多平台上面是4K的大小,这就是说在0开始的一段地址空间都是非法地址(一般4K)。