2016-08-08 12 views
-1

昨日、charポインタの配列の場合に、私はC++で奇妙な動作に遭遇しました。charポインタの初期化の異常動作

int main() { 
    char *args[] = {(char *) std::to_string(12345).c_str(), (char *) std::to_string(12346).c_str()}; 
    printf("%s %s\n", args[0], args[1]); 

    return 0; 
} 

、出力は次のとおりです:ここで

は、コード例です

12346 12346 

私は答えが "12345 12346" であることを仮定します。どんな助け? 私のコンパイルフラグは-std = C++ 11でg ++を使用しています。

答えて

5

あなたが作成したこれらの文字列は一時的なものです。あなたはc_strへのポインタを作成してからそれらを破棄しています。ポインタの内容は迷惑メールになります。

EDIT:修正を加えることを提案してくれたBarmarに感謝します。

int main() 
{ 
    std::string string1 = std::to_string(12345); 
    std::string string2 = std::to_string(12346); 

    const char *args[] = {string1.c_str(), string2.c_str()}; 
    printf("%s %s\n", args[0], args[1]); 
    return 0; 
} 

このコードで命名のstd ::文字列は(波括弧の近くで - })スコープの終わりまでに破壊されることはありませんに

+0

また、あなたがconstとして捨ててはいけませんchar *を返すc_str –

+1

最も役立つように、コードを修正する方法を示す必要があります。 – Barmar

+0

ありがとうたくさんの人。今は理にかなっている。 – balexios