1. ホーム
  2. c++

[解決済み] スタックアロケーションにより初期化されていない値が作成された

2022-01-29 08:47:52

質問

Valgrindというツールを使って、私のコードをデバッグしました。その結果、この関数でこのエラーが表示されました。以下に、そのエラーと私の関数を示します。私はここで何が問題なのか分からないのですか?どのように私はそれを修正することができますか? 私のエラーは、次のとおりです。

0x80996D7 のスタックアロケーションにより、未初期化値が作成されました。 cdtojd(std::string const&)

My Codeは。

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

解決方法は?

エラーの意味は、本質的には、代入する前の変数を使用しているということです。これが適用される可能性があるのは、以下の変数だけです。 dd , mm , yy .

これは、あなたの sscanf の呼び出しは、3つ全てに書き込まれているわけではありません。これは、完全に指定されていない日付を渡すと発生します。

なお sscanf は、書き込んだ変数の個数を示す値を返します。返り値をチェックして、3が返らない場合は中止する(あるいはデフォルト値を入力する)べきです。