未初始化的值是由堆栈分配创建的

Uninitialised value was created by a stack allocation

本文关键字:堆栈 分配 创建 初始化      更新时间:2023-10-16

我使用工具Valgrind调试了我的代码。它显示了此函数中的错误。我在下面给出了错误和我的函数。我不知道这里出了什么问题?我该如何纠正?我的错误是.

未初始化的值是由0x80996D7处的堆栈分配创建的:cdtojd(std::string const&)

我的代码是.

double cdtojd(const string &cdate);
double cdtojd(const string &cdate)
{
    int dd,mm,yy;
    int y,m;
    double jd=0;
    //mm = atoi(cdate.substr(0,2).c_str());
    //dd = atoi(cdate.substr(2,2).c_str());
    //yy = atoi(cdate.substr(4,4).c_str());
    sscanf(cdate.c_str(),"%2d%2d%4d",&mm,&dd,&yy);
    //cout<<mm<<"..."<<dd<<"...."<<yy<<endl;
    y = (yy - 1900) * 372;
    m = (mm-1) * 31;
    jd = dd + m + y;
    return jd;
}

错误的含义本质上是在分配变量之前使用了变量。这可能适用于的变量只有ddmmyy

这意味着您的sscanf调用并没有同时写入这三个调用。如果您输入的日期没有完全指定,就会发生这种情况。

请注意,sscanf返回一个值,告诉您它写入了多少变量。您应该检查返回值,如果不返回3,则中止(或填充一些默认值),因为这样并不是所有字段都已填充。

sscanf没有错误检查,这意味着一些变量可能会保持未初始化状态,然后使用,例如

std::string str = "invalid";
unsigned int dd,mm,yy;
cout << dd << " " << mm << " " << yy << endl;
cout << "Arguments read: " << sscanf(str.c_str(),"%2d %2d %4d",&mm,&dd,&yy) << endl;
cout << dd << " " << mm << " " << yy;

上述代码可能作为输出发出:

32550 3249645428 32550
Arguments read: 0
32550 3249645428 32550

其中所有三个参数仍然未初始化。