说明:变量最好在定义时初始化。如果定义时无法初始化,那就应该在定义后立即初始化。
以下我们来分析下变量未初始化而被使用的场景:
在debug环境下,我们声明一个变量,编译器会使用0xCC填充变量所在空间。而在Release环境下,变量所在空间是不会被初始化的。所以我们经常会发现一些奇怪的现象:在debug环境下逻辑是正确的,release环境下逻辑是错误的。
变量没有初始化存在如下危害:
void MyPrintf( char* p ) { strcat(p, "abcdefghijklmnopqrstuvwxyz"); printf("%s", p); } int _tmain(int argc, _TCHAR* argv[]) { char szBuffer[32]; std::string str = "01234"; memcpy_s( szBuffer, _countof(szBuffer), str.c_str(), str.length() ); MyPrintf(szBuffer); return 0; }
该例中,栈上分配了一段32字节的空间。由于该空间没有初始化,所以在一定概率下,这段内存中不会出现0x00。于是之后的strcat将会导致堆栈溢出。我这儿将strcat放到一个函数内部,是为了比较方便的触发崩溃。
基于以上危害,我们在申明变量时需要初始化。类的成员变量,需要在构造函数中初始化。
这儿有个需要特别说明的,静态数组初始化请使用:
char szPath[MAX_PATH] = {0};而以下这种写法就没有上面这种写法方便和效率高:
char szPath[MAX_PATH]; memset( szPath, 0, sizeof(szPath) );
RECT mainrc; mainrc.left += 124; mainrc.top += 56;该例子,试图计算出一个窗口中某个控件的位置(无窗口控件)。但是对于第一次读这样的代码的同学,谁知道那两个常量是什么意思?可以这么修改:
RECT mainrc; const unsigned int unCloseBtnOffX = 124; const unsigned int unCloseBtnOffY = 56; mainrc.left += unCloseBtnOffX; mainrc.top += unCloseBtnOffY;
说明:这样设计将使得代码可读性加强。
Windows客户端C/C++编程规范“建议”——变量和常量
原文:http://blog.csdn.net/breaksoftware/article/details/37935323