Richard

Visual C++对于内存位置0的处理

0
阅读(2599)

NULL指针并不指向任何对象。因此,除非是用于赋值或比较运算,由于其它目的使用NULL指针都是非法的。不同的编译器对于内存位置0的处理各不相同。某些编译器对内存位置0强加了硬件级的读保护,在其上工作的程序如果错误使用了一个NULL指针,将立即终止执行。其它一些C编译器对内存位置0只允许读,不允许写。在这种情况之下,一个NULL指针似乎指向的是某个字符串,但其内容通常不过是一堆“垃圾信息”。好友一些C编译器对内存位置0即允许读,也允许写。在这种实现上面工作的程序如果错误使用了一个NULL指针,则可能覆盖了操作系统的部分内容,造成彻底的灾难。严格说来,这并非一个可移植性问题:在所有C程序中,误用NULL指针的效果都是未定义的。然而,这样的程序有可能在某个编译器上“似乎”能够工作,只有当该程序转移到另一台机器上运行的时候才会暴露出问题来。

经过试验,在Visual C++中即不允许对内存0进行读操作,也不允许进行写操作。

01 #include <stdio.h>
02 int main()
03 {
04 char *p;
05 p = NULL;
06 *p = 'c';
07 printf("Location 0 contains %d.\n",
08 *p);
09 return 0;
10 }

第六行和第七行的操作时不允许的:Unhandled exception in ***.exe:0x00000005:Access Violation.