为什么我不能取消引用空指针?也就是说,为什么我不能读/写哪个地址只是0?
我的进程的基本指针是否有不同的地址?如果是,是否有办法获得可用于我的进程的默认堆的较低内存加法器?
答案 0 :(得分:9)
空指针不是指向“内存[其地址只是0”的指针。它只是一个特殊的指针,并没有指向任何有效的东西。
C语言表示对取消引用空指针的程序的行为没有要求。
答案 1 :(得分:3)
位于地址(void *)0x0
或NULL
的VM页面默认情况下未在任何现代操作系统中映射,因此取消引用NULL
指针将导致分段违规。
NULL
指针经常被用作指向无处的指针。
是的,您可以获取文本,堆栈和堆栈的地址。对于堆栈,这相对容易,对于文本和堆,您需要咨询/proc/self/smaps
(如果您有procfs
)。
答案 2 :(得分:3)
为什么我打不到00000 000 000
的电话?我应该能够做到这一点。
答案 3 :(得分:1)
值为NULL的指针应被视为"指向 nothing "而不是指向某个对应于0的内存地址的东西。 / p>
答案 4 :(得分:1)
6.3.2.3指针
...
3一个整数常量表达式,其值为0,或者此类表达式强制转换为类型void *
被称为空指针常量。 66)如果将空指针常量转换为a 指针类型,结果指针,称为空指针,保证比较不等 指向任何对象或功能的指针
66)宏NULL
在<stddef.h>
(和其他标题)中定义为空指针常量;见7.19。
强调我的。 NULL
被定义为无效指针值,表示定义明确的“无处”。你不能取消引用它,因为没有任何解除引用的东西。请注意,尽管空指针常量始终为0值,但空指针值不一定是;它可以是0x00000000
或0xDEADBEEF
或完全不同的东西;这取决于平台。
TL; DR,NULL
不代表地址0
;它代表“没有地址”。