1
2
3
//常见错误
int *a;
*a = 12;

该代码段,声明了一个名为 a 的指针变量,之后将 12 存储在 a 所指向的空间中。

声明了变量 a,但未对其初始化,所以并不知道 a 所指向的具体位置,即数据 12 将存储于什么地方尚未可知。

声明一个指向整型的指针,不会创建用于存储整型值的内存空间。

对于该代码段可能造成的结果:

  • 报错

若 a 的初始值是非法地址,则赋值语句将会报错,从而终止程序。在 UNIX 系统上,这种错误通常为“段错误(segmentation fault)”、“段违例(segmentation violation)”或“内存错误(memory fault)”。提示程序在试图访问一个并未分配给程序的内存位置。

  • 不报错

若 a 的初始值刚好是一个合法的地址,则该地址的原值被新的赋值语句所覆盖,虽然你并无意修改该地址的值。这种情况下导致的错误很难发现,因为引发错误的代码大概率与原本用于操作被修改值的代码毫不相干。因此,在对指针进行间接访问之前,务必确保指针变量已被初始化。