下面这段代码展示了一个极为常见的错误:
1. #include <stdio.h>
2. int main(void)
3. {
4. int *a;
5. *a=12;
6. printf("a=%d\n",*a);
7. return 0;
8. }
这个声明创建了一个名为a的指针变量,后面那条赋值语句把12存储在a所指向的内存位置.
a究竟指向哪里?
我们声明了这个变量,但从未对它进行初始化,所以我们无法预测12这个值将存储于什么位置,从这一点看指针变量和普通变量并无区别。
- 如果变量是静态的,它会被初始化为0;
- 如果变量是自动的,它不会被初始化;
无论是哪种情况,声明一个指向整型的指针都不会传创建用于存储整型值的内存空间。
如果程序执行这个赋值操作,会发生什么情况?
a的初始值是个非法地址,这样赋值语句将会出错,程序将终止。
在unix系统上:这个错误称为
“段违例”(segmentation violation)或“内存错误”(memory fault)。
它提示程序正在试图访问一个未分配给程序的内存位置。
在windows系统上:对未初始化或非法指针进行间接访问是一般性保护性异常(General Protection Exception)的根源之一。
unix中的总线错误(bus error)
对于那些要求整数必须存储于特点边界对机器而言,如果这类数据在内存中的存储地址处在错误的边界上,那么对这个地址进行访问时将会产生一个错误。
一个更为严重的情况是:
这个指针偶尔包含一个合法的地址,那个位置的值将被修改,虽然你并无意去修改它。
像这种类型的错误非常难以捕捉,因为引发错误的代码可能与原先用于操作那个值的代码完全不相干。
结论:
在你对指针进行间接访问之前,必须非常小心,确保它们已被初始化!
END!