变量声明赋予初值,可以避免由于编程人员的疏忽导致的变量未初始化引用。
示例
1. SOCKET s = INVALID_SOCKET;
2. unsigned char *msg = NULL;
3. BOOL success = FALSE;
4. int fd = -1;
代码示例:
#include<iostream>
void testInit(const bool fCondition)
{
char *pMsg;
if(fCondition)
{
pMsg = (char *)malloc(10);
//...
}
if(pMsg != nullptr)
{
free(pMsg);
}
}
int main()
{
testInit(false);
return 0;
}
编译运行:
图2
如上图2程序报无效指针,直接崩了。
通过gdb查看崩溃的core文件,原因:因为传入的参数是fCondition,pMsg没有初始化没有指定为nullptr,在12行释放了无效指针。
修改程序验证:
#include<iostream>
void testInit(const bool fCondition)
{
char *pMsg = nullptr;
if(fCondition)
{
pMsg = (char *)malloc(10);
//...
}
if(pMsg != nullptr)
{
free(pMsg);
}
std::cout<<"testInit success"<<std::endl;
}
int main()
{
testInit(false);
return 0;
}
编译运行ok
对全局变量,静态变量,在编译阶段自动初始化为0或者等于NULL,不用在定义时强制初始化。 因为系统会自动初始化为0或者NULL;
测试代码
#include<iostream>
int g_iNoInit;
char* g_pNoInit;
bool g_fNoInit;
int main()
{
static int sINoInit;
std::cout<<"g_iNoInit = "<<g_iNoInit<<std::endl;
std::cout<<"sINoInit = "<<sINoInit<<std::endl;
if(!g_pNoInit)
{
std::cout<<"g_pNoInit == NULL"<<std::endl;
}
std::cout<<"g_fNoInit = "<<std::boolalpha<<g_fNoInit<<std::endl;
return 0;
}
编译运行如下图: