指针常见错误
错误 1:未初始化的指针
一个最易犯的指针错误是试图引用未初始化(因而指向的是无效地址)的指针。例如:
int*p;
*p=12;
指针p在声明时未初始化,指向的是一个随机的内存地址。它可能指向系统栈、全局变量、程序代码区或操作系统。执行*p=12;时,程序会不加辨别地试图在p指向的随机位置处写入一个12。这时程序有可能立即崩溃,也可能等上半小时然后崩溃,或者程序另一个部分的数据被悄然破坏而您却浑然不知。可见这种错误非常难于排查。请确保指针解引用(取出指针指向的地址中的内容)之前所有的指针已被初始化为指向有效地址。
错误 2:无效指针引用。
当指向无效地址的指针仍被引用时即发生无效指针引用。
导致这类错误的一种可能是当q未初始化时执行p=q;。此时指针p也变为未初始化的。任何对*p的引用即造成无效指针引用。
避免此类错误的惟一途径是用画图的方法记录每个步骤的指针引用情况,并确保全部指针都各有所指。由于和错误1同样的原因,无效指针引用也会导致程序莫名其妙地崩溃。
错误 3:零指针引用
当试图在程序中引用指向零地址的指针时即发生零指针引用。例如,若p是一个整型指针,则下面的代码是无效的:
p=0;
*p=12;
p不指向任何内存块。所以,试图对此内存块的读写即为无效的零指针引用。我们会在后文看到,将指针指向零地址是有充分的正当理由的。然而,对零指针的解引用(取出指针指向的地址中的内容)却是无效的。
所有这些错误,对于一个程序来说都是致命的。要谨防您的程序产生这些错误。最好的方法是为程序的每一步画图记录指针引用情况。