取消引用空指针

时间:2014-05-21 15:10:46

标签: c nullpointerexception

为什么我不能取消引用空指针?也就是说,为什么我不能读/写哪个地址只是0?

我的进程的基本指针是否有不同的地址?如果是,是否有办法获得可用于我的进程的默认堆的较低内存加法器?

5 个答案:

答案 0 :(得分:9)

空指针不是指向“内存[其地址只是0”的指针。它只是一个特殊的指针,并没有指向任何有效的东西。

C语言表示对取消引用空指针的程序的行为没有要求。

答案 1 :(得分:3)

位于地址(void *)0x0NULL的VM页面默认情况下未在任何现代操作系统中映射,因此取消引用NULL指针将导致分段违规。

NULL指针经常被用作指向无处的指针。

是的,您可以获取文本,堆栈和堆栈的地址。对于堆栈,这相对容易,对于文本和堆,您需要咨询/proc/self/smaps(如果您有procfs)。

答案 2 :(得分:3)

为什么我打不到00000 000 000的电话?我应该能够做到这一点。

答案 3 :(得分:1)

值为NULL的指针应被视为"指向 nothing "而不是指向某个对应于0的内存地址的东西。 / p>

答案 4 :(得分:1)

C 2011 online draft

6.3.2.3指针
...
3一个整数常量表达式,其值为0,或者此类表达式强制转换为类型 void *被称为空指针常量。 66)如果将空指针常量转换为a 指针类型,结果指针,称为空指针保证比较不等 指向任何对象或功能的指针
66)宏NULL<stddef.h>(和其他标题)中定义为空指针常量;见7.19。

强调我的。 NULL被定义为无效指针值,表示定义明确的“无处”。你不能取消引用它,因为没有任何解除引用的东西。请注意,尽管空指针常量始终为0值,但空指针不一定是;它可以是0x000000000xDEADBEEF或完全不同的东西;这取决于平台。

TL; DR,NULL不代表地址0;它代表“没有地址”。