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

时间:2014-10-04 08:01:09

标签: c++ valgrind

我使用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;
}

2 个答案:

答案 0 :(得分:3)

错误的含义本质上是指在分配变量之前使用变量。唯一可能适用的变量是ddmmyy

这意味着您的sscanf来电并未写入所有这三个电话。如果您传入未完全指定的日期,则会发生这种情况。

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

答案 1 :(得分:1)

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

其中所有三个参数都保持未初始化。