0

これは私のコードの一部です:

for(int i=0; i<10; i++)
{
    tab[i]=new char[80];
    oss.str("");
    oss<<"line number: <<i;
    temp=oss.str();
    tab[i]=(char*)temp.c_str();
}

タブを印刷すると、結果は 8 番目と 9 番目になります。

4

1 に答える 1

2

たくさんのコメントをまとめてまとめます (コメンテーターが代わりに答えないのはなぜですか?):

そこで実際に行っているのは、 のポインター値をtab[i]、割り当てられたメモリから の内部文字列に変更することですtemptempメモリが破壊されるとすぐに解放されるため、これは悪い考えです。

temp私が見る限り、あなたはまったく必要ありません。

これを修正する C の方法はstrcpy(tab[i], oss.str().c_str())、文字を 1 つずつコピーするを使用することです。現在のコードでは、new char[80]文字列が 79 文字を超えるとオーバーフローすることに注意してください。'd バッファーを使用する必要がある場合はnew、次のようにします。new char[oss.str().size() + 1]

これを修正する C++ の方法は、 の配列のstd::string代わりに の配列を使用することですchar*。次に、好きなように割り当てるだけで、tab[i] = oss.str()それを適切にコピーできます。また、配列が範囲外になったときに使用されるメモリをクリーンアップします。これは、コードが現在行っていないためです。

于 2015-10-22T20:14:15.757 に答える