首先,以一个程序作为开始。

/*程序1*/#include
int i;int main(){ int *p, * q, *r, *s; printf("指针p的值 :%p\n", p); printf("指针q的值 :%p\n", q); printf("指针r的值 :%p\n", r); printf("指针s的值 :%p\n", s); printf("指针p指向的内存单元的内容 :%d\n", *p); return 0;}

   在ubuntu 12.04环境下编译、运行结果如图1:

图1 程序1ubuntu上运行结果

   从图1的运行结果来看,未初始化的指针是可以读取其值的,这说明未初始化的指针是有值的,只不过我们无法预测,但也可能是没有值的,就如指针q的值是nil(nil表示无值)。对于有值的并且未初始化的指针,我们可以读取该指针指向的内存单元的内容,这个内容也是无法预测的。读取未初始化的指针的值是没有意义的,因为我们不知道它会是什么值,但这种操作在程序运行过程中会产生意想不到的错误。

   在windows xp环境下编译、运行结果如图2:

图2 程序1在windows上运行结果

   从图2的运行结果来看,我们发现未初始化的指针的值都是0xCCCCCCCC,这是因为在VC++中,程序在debug模式下,未初始化的指针自动初始化为0xCCCCCCCC,而0xCCCCCCCC是程序不能访问的地址,访问时会触发异常(参考

   现在我们来看另一个程序,代码如下:

/*程序2*/#include
int main(){ int *p; printf("准备给*p赋值\n"); *p = 2; printf("完成赋值\n"); return 0;}

   在ubuntu上的运行结果如图3所示。

图3 程序2在ubuntu上运行结果

从图3的运行结果来看,没有成功给指针p指向的内存单元内容赋值,对未初始化的指针指向的内存单元进行写操作也是不允许的,因为对未知内存进行写操作是很有可能破坏系统的。

   其实,这些看是简单的知识细节,在编程时如不注意,会操造成一些无法预测的错误,比如在指针用作参数进行传递时,得不到预期的结果,尤其是新手或者对指针了解不深的程序员。另外,在C语言里,全局变量(包括静态的)和局部静态变量的默认值是0,而局部非静态变量是没有默认值的,它的值是未知的。