当我有这样的代码时:
int* nPtr = 0;
MyClass* myClass = 0;
什么编译器真正做到了底层。我的意思是无论如何必须在记忆中有一些地方可以参考。 编译器是否有一个特殊的内存块用于指向所有引用位置的空指针?
答案 0 :(得分:2)
我的意思是无论如何必须在记忆中有一些地方可以参考。
不。您不能取消引用NULL指针并获取对象。内存位置0x0 *没有对象。
这只是一个惯例,我们有一个[无效]指针值,我们可以用它来识别指针,因为故意不指向任何有效的。
* - 或者你的实现决定用于0指针
答案 1 :(得分:1)
编译器唯一的“处理”是0
不一定被翻译为地址存储器0
。这是指定的实现。
编译器只会将此0
映射到一个不可能成为进程用户空间一部分的特定地址。
当尝试访问进程用户空间之外的地址时,操作系统通常会“捕获”访问权限并发出错误。在Unix系统上,这是臭名昭着的SEGFAULT。
请注意,对于具有指向进程用户空间之外的垃圾值的指针,也会发出同样的错误。
答案 2 :(得分:0)
指针是内存中某个位置的地址。在这种情况下,地址为0.它指向“零位置”。当您尝试访问它时,会出现Seg Fault。编译器不会抱怨它。