编写高质量代码:改善C++程序的150个建议(连载4)

发表于:2012-4-06 09:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李健    来源:51Testing软件测试网采编

  建议5:不要忘记指针变量的初始化

  可以说指针是C/C++语言编程中最给力的工具。指针,让我们直接去面对最为神秘的内存空间,赋予我们对内存进行直接操作的能力。由于指针操作执行速度快、占用内存少,众多程序员对它深爱不已。但是,它的灵活性和难控制性也让许多程序员觉得难以驾驭,以致到了谈指针色变的程度。

  指针就是一把双刃剑。用好了它,会给你带来诸多便利,反之,则往往会引发意想不到的问题。

  其中,指针的初始化就是我们应当重视的问题之一。指针应当被初始化,这是一个毋庸置疑的问题,关键是应该由谁来负责初始化,是编译器,还是程序员自己?

  为了更好地贯彻零开销原则(C++之父Bjarne在设计C++语言时所遵循的原则之一,即“无须为未使用的东西付出代价”),编译器一般不会对一般变量进行初始化,当然也包括指针。所以负责初始化指针变量的只有程序员自己。

  使用未初始化的指针是相当危险的。因为指针直接指向内存空间,所以程序员很容易通过未初始化的指针改写该指针随机指向的存储区域。而由此产生的后果却是不确定的,这完全取决于程序员的运气。例如下面的程序片段:

  1. #include <iostream> 
  2. int main()  
  3. {  
  4.      int *pInt;  
  5.      std::cout<<pInt<<"\n";  
  6.      return 0;  
  7. }

  在VC++中,程序在Release模式下输出0x004080d0,而在Debug模式下输出0xcccccccc。很明显未初始化的指针指向的是一个随机的地址。如果对其执行写操作会怎样?那很有可能会直接导致程序崩溃。

  可以将指针初始化为某个变量的地址。需要注意的是,当用另一个变量的地址初始化指针变量时,必须在声明指针之前声明过该变量。代码片段如下所示:

  1. int number = 0;     // Initialized integer variable  
  2. int* pNumber = &number;     // Initialized pointer

  当然,我们在必要时也可以将其初始化为空指针0(NULL):

int* pNumber = NULL;     // Initialized pointer as NULL

  如果使用未初始化的局部变量,程序编译时会给出警告C4700:

warning C4700: 使用了未初始化的局部变量"**"

  需要注意警告中的四个字“局部变量”。因为对于全局变量来说,在声明的同时,编译器会悄悄完成对变量的初始化。代码片段如下所示:

  1. #include <iostream> 
  2. int *pInt;  
  3. int main()  
  4. {  
  5.     std::cout<<pInt<<"\n";  
  6.     return 0;  
  7. }

  此时,程序编译不会再出现警告,程序输出:00000000。

  请记住:

  使用未初始化的局部指针变量是件很危险的事,所以,在使用局部指针变量时,一定要及时将其初始化。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号