上一页 下一页

C语言编程基础

指针:常见错误

错误 #1 - 未初始化的指针

产生指针错误最简单的方法之一是尝试引用一个未初始化且尚未指向有效地址的指针的值。例如

广告

	int *p;

	*p = 12;

指针 p 在声明时未初始化,并指向内存中的随机位置。它可能指向系统堆栈、全局变量、程序代码空间或操作系统。当你执行 *p=12; 时,程序将简单地尝试将 12 写入 p 指向的任何随机位置。程序可能会立即崩溃,也可能会等待半小时后崩溃,或者它可能会悄悄地破坏程序中其他部分的数据,而你可能永远都发现不了。这使得这种错误很难追查。在解引用所有指针之前,请确保将其初始化为有效地址。

错误 #2 - 无效指针引用

当一个指针的值被引用,但该指针并未指向一个有效块时,就会发生无效指针引用。

产生此错误的一种方法是执行 p=q;,而此时 q 未被初始化。那么指针 p 也会变成未初始化,任何对 *p 的引用都是无效指针引用。

避免此错误的唯一方法是绘制程序每个步骤的图示,并确保所有指针都指向某个位置。无效指针引用会导致程序无故崩溃,原因与错误 #1 中所述相同。

错误 #3 - 空指针引用

当一个指向零的指针被用于尝试引用某个块的语句中时,就会发生空指针引用。例如,如果 p 是一个指向整数的指针,以下代码是无效的

p = 0;
*p = 12;

p 没有指向任何块。因此,尝试从该块读取或向该块写入任何内容都是无效的空指针引用。将指针指向零有充分且正当的理由,我们将在后续文章中看到。然而,解引用此类指针是无效的。

所有这些错误对于包含它们的程序来说都是致命的。你必须检查你的代码,以确保这些错误不会发生。最好的方法是逐步绘制代码执行的图示。