gfv*_*gfv 55 c memory pointers dereference
有时内存地址为0x0的数据非常有价值 - 以x86实模式IVT作为一个更为人熟知的例子:它从0x0开始并包含指向中断处理程序的指针:0x00处的双字是指向零错误处理程序的指针.
但是,C11语言标准禁止解除引用空指针[WG14 N1570 6.5.3.2],它们被定义为用0初始化的指针或用空指针[WG14 N1570 6.3.2.3] 初始化的指针,有效地禁止了第一个字节.
人们如何在需要时实际使用0x0?
Kei*_*son 47
C不禁止解除引用空指针,它只是使它成为未定义的行为.
如果您的环境是能够取消引用包含该地址的指针0x0,那么您应该能够这样做.C语言标准没有说明当你这样做会发生什么.(在大多数环境中,结果将是程序崩溃.)
一个具体的例子(如果我正确记住这一点):在基于68k的Sun 3计算机上,取消引用空指针不会导致陷阱; 相反,操作系统在内存地址零处存储零值,并且取消引用空指针(指向地址零)将产生该零值.这意味着,例如,C程序可以将空指针视为指向空字符串的有效指针.有意或无意的某些软件依赖于这种行为.当将软件移植到基于SPARC的Sun 4时,这需要进行大量的清理,因为Sun 4陷入空指针解除引用.(我清楚地记得读到这个,但我找不到参考;如果我能找到它,我会更新它.)
需要注意的是空指针并不一定是解决零.更确切地说,null的表示可以是也可以不是全比特零.它很常见,但不能保证.(如果不是,那么整数到指针的转换(void*)0是非常重要的.)
comp.lang.c FAQ的第5节讨论了空指针.
该声明:
char * x = 0;
Run Code Online (Sandbox Code Playgroud)
不一定将0x0放入x.它将当前体系结构和编译器的已定义空指针值放入x.
现在,实际上,所有常见的编译器/处理器都会在寄存器或存储位置连续放置32位(或64位)0位以响应该语句,因此,如果内存地址0有用,然后,正如其他人所指出的那样,你使用正式的未定义行为.然而,曾经有过硬件,其中"空指针"是一些不是全零的位模式,并且,谁知道,可能会再次出现.