2011-09-26 5 views
4

私は前にプログラミングしている間にかなり混乱しましたが、これはケーキを取ります。基本的に私は1つのループの値を設定し、次の繰り返しでは次のループの値に変更します。変数値の変更自体

for (int i = 0; i < 2; ++i) 
{ 
    for (int j = 0; j < numWords[i]; ++j) //numWords [0] = 9, numWords [1] = 7 
    { 
     stb[i][j].word = const_cast<char*>(is (j + 1,1).c_str()); //is(int,length[opt]) converts int to string, c_str() returns const char *, but I need char * 
     cout << is(j+1,1) << ' ' << stb[i][j].word << '\n'; 
    } 
} 

for (int i = 0; i < 2; ++i) 
{ 
    for (int j = 0; j < numWords [i]; ++j) 
    { 
     cout << stb[i][j].word << ' '; 
    } 
    cout << '\n'; 
} 

出力:

 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 

私の唯一の推測では、今のconstで何かですが、それは以前のすべての配列要素を変更し続けるだろう、なぜそれは意味がありません...

+3

あなたはまだ 'is()'を表示していません。 –

+0

さて、私は実際に理由を見つけました。まず最初に、is()は正常に動作しますが、文字列は連続するメモリ位置に各文字を格納する必要がないので、cstr()に渡す文字列が変更されるとすぐにchar *それから。私はこれにどれくらいの時間を費やしていますか?/ – chris

+1

'const_cast'を使わないでください。これまで(あなたがC++で十分な経験があれば、いつ安全になるのか知ることができます) –

答えて

3

このかなりシンプルです。あなたのプログラムは未定義の動作をしています(私の仮定が約is()である場合)。

is(int, length)は、値でstd::stringを返します。その内のいくつかの内部構造体へのポインタはc_str()を使用してstringになります。この文字列は、完全式の末尾で破棄されます。この破棄は、c_str()から取得したポインタを無効にします。

これは、無効なメモリへのポインタで配列を埋めることを意味します。次に、これらのポインタから配列の内容を出力します。無効なメモリから読み取ると、未定義の動作が発生します。

観察された行動のための可能な説明は、このです:

stringisその戻り、同じメモリを再利用します。最初のループでは、isへの別の呼び出しによって上書きされる前にメモリから読み込み、正しい値を取得します。 2番目のループでは、オーバーライトされた後にメモリから読み込み、配列の最終値を取得します。

+0

それは理にかなっています。今私の問題は、私が試したことは意図した通りに動作しないことです。私は単語としてchar *が必要です。 – chris

+1

@chris - 文字列を所有する別々の 'std :: vector'または配列を作成し、その配列にある文字列から' char * 'を取得します。 – Mankarse

関連する問題