0

次のコードがどのように機能し、アプリケーションをクラッシュさせないかを誰か説明できますか?

int main() {
    char *tempStr = new char[5];
    tempStr[0] = '\0';
    string stemp = "helloworld";
    stringstream sstream;
    sstream.str(stemp);
    cout << "len before = " << strlen(tempStr);
    sstream >> tempStr;
    cout << "len after = " << strlen(tempStr) << endl;
    cout << tempStr << endl;
    delete[] tempStr;
    return 1;
}

私は次のように出力を得ています

len before = 0
len after = 10
helloworld
  1. stringstreamchar ポインタの余分な文字にメモリを割り当てましたか?
  2. stringstreamまた、割り当てられたメモリを超えずに、データを char* 配列にコピーする正しい方法を知りたいchar*ですか?
4

2 に答える 2

3

stringstream は char ポインタの余分な文字にメモリを割り当てましたか?

いいえ、あなたのコードは未定義の動作を呼び出します。

また、char* に割り当てられたメモリを超えずに、stringstream から char* 配列にデータをコピーする正しい方法を知りたいですか?

に読み込むのは得策ではありませんchar*std::stringストリームから入力を読み取るために使用します。それでも、知識のために知りたい場合は、 を使用してstd::istream::read()ください。

if ( sstream.read(tempStr, 5 ) )
{
   //read succeeded
}

ところで、次の 2 行をマージできます。

stringstream sstream;
sstream.str(stemp);

1つに:

stringstream sstream(stemp);

または単にこれ:

stringstream sstream("helloworld"); //no need of stemp!

それが役立つことを願っています。

于 2013-03-28T12:55:20.367 に答える
1
  1. いいえ。メモリを上書きして、未定義の動作を呼び出しましたが、明らかなことは何も起こらなかったため、エラーは見過ごされました。このようなことを行うことで、何らかの種類の人間が目に見えるエラーや特別なアクションをトリガーする必要はありません。
  2. チャンクごとcharに実行し、スペースが不足した場合は配列を再割り当てする必要があります。C++ では、これを手動で行う意味はほとんどありません。使用するだけstd::stringで完了です。
于 2013-03-28T12:54:05.577 に答える