指针变量、表示资源描述符的变量、BOOL变量声明必须赋予初值

7 篇文章 0 订阅
1 篇文章 0 订阅

变量声明赋予初值,可以避免由于编程人员的疏忽导致的变量未初始化引用。
示例
 

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;
}

编译运行如下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值