何为指针(二)未初始化和非法的指针

来源:互联网 发布:家常菜教学视频软件 编辑:程序博客网 时间:2024/06/10 15:13

Pointers or C 英文版翻译

原文:6.5 Uninitialized and Illegal Pointers


6.5 未初始化和非法的指针


下面这段代码举例说明了一个非常普遍的问题

int *a;*a = 12;

声明了一个名为 a 的指针变量,并且把12赋值给了它指向的位置。但是,指针指向哪里呢?我们声明了这个变量,却从来没有初始化它。所以我们没法预测12被存储在哪里。在这方面,指针和其他变量没有任何不同。如果变量是静态的,那么他会被初始化为0;但是,如果变量是自动(存储)的,他压根就没有被初始化。这两种情况下,将会声明一个指向任意一个存储整数的内存的int型指针。


所以,当这个赋值操作被执行时,会发生什么?如果你运气好,a的初始值将是一个非法地址,并且赋值操作将导致一个程序终止的错误。在UNIX 系统上,这个错误被叫做“内存段异常”或者“内存错误”。这表明你在试图使用超出你的程序被允许的范围之外的内存位置。在PC上运行的Windows,间接上,未初始化或者非法指针是引发异常的原因之一


在要求整数在特定边界处的机器上,使用一个对于它的类型是错误边界的地址也会造成错误。这个错误在UNIX系统上被称为“总线错误(bus error)”;


一个更加严重的问题是,当这个指针意外的存储这一个合法的地址。接下来要发生的事情 很简单:在那个位置的值被修改了,尽管你没有想要修改它。像这样的错误很难被发现,因为可能错误的代码和应该被改变值的代码完全没有关系。要十分谨慎,在使用指针变量间接指向之前被初始化。


译者:小风code

时间:2017-11-4

原创粉丝点击