编译器如何处理空指针

时间:2011-06-29 14:17:28

标签: c++

当我有这样的代码时:

int* nPtr = 0;
MyClass* myClass = 0;

什么编译器真正做到了底层。我的意思是无论如何必须在记忆中有一些地方可以参考。 编译器是否有一个特殊的内存块用于指向所有引用位置的空指针?

3 个答案:

答案 0 :(得分:2)

  

我的意思是无论如何必须在记忆中有一些地方可以参考。

不。您不能取消引用NULL指针并获取对象。内存位置0x0 *没有对象。

这只是一个惯例,我们有一个[无效]指针值,我们可以用它来识别指针,因为故意不指向任何有效的


* - 或者你的实现决定用于0指针

答案 1 :(得分:1)

编译器唯一的“处理”是0不一定被翻译为地址存储器0。这是指定的实现。

编译器只会将此0映射到一个不可能成为进程用户空间一部分的特定地址。

当尝试访问进程用户空间之外的地址时,操作系统通常会“捕获”访问权限并发出错误。在Unix系统上,这是臭名昭着的SEGFAULT。

请注意,对于具有指向进程用户空间之外的垃圾值的指针,也会发出同样的错误。

答案 2 :(得分:0)

指针是内存中某个位置的地址。在这种情况下,地址为0.它指向“零位置”。当您尝试访问它时,会出现Seg Fault。编译器不会抱怨它。