1

ここで明らかな事実を見落としていたに違いありません - しばらく C++ をプログラミングしていません。c-style 文字列を const char* 変数に代入した後に出力できないのはなぜですか? しかし、割り当てずに直接印刷しようとすると、正常に動作します:

#include "boost/lexical_cast.hpp"

using namespace std;
using boost::lexical_cast;

int main (int argc, char** argv)
{
    int aa=500;
    cout << lexical_cast<string>(aa).c_str() << endl;   // prints the string "500" fine

    const char* bb = lexical_cast<string>(aa).c_str();
    cout << bb << endl;                                 // prints nothing

    return EXIT_SUCCESS;
}
4

2 に答える 2

5

によって返される C 文字列は、取得元の が存在するc_str間のみ使用できます。std::stringそれstd::stringが破壊されると、C String もなくなります。(その時点で、C String を使用しようとすると、未定義の動作が発生します。)

他の操作によっても C 文字列が無効になる場合があります。一般に、文字列を変更する操作は、 によって返されるポインタを無効にしますc_str

于 2013-01-17T05:28:33.813 に答える
3

c_str関数は、stringから作成されたテンポラリの結果に対して呼び出されlexical_castます。保存しないため、文字列はその式の最後で破棄されるため、破棄された文字列へのポインターへのアクセスc_strは未定義の動作です。

于 2013-01-17T05:28:36.010 に答える