2017-12-25 9 views
0

私は奇妙な問題があります。私は、構造体配列のchar []の値を割り当てるが、それらは迷子: -------構造体はこの1つである:C++構造体の値が失われました

typedef struct _Settings 
{ 
    const char* str; 
    uint val; 
}Settings; 

-------私はこのようにそれを作成します。

int nn=10; 
settings = new Settings[nn]; 
for (int i = 0; i < nn; i++) { 
     string strr = "thisOneIs"; 
     strr.append(std::to_string(i)); 
     settings[i].str = strr.c_str(); 
     string teststr = settings[i].str; //// (1) 
     settings[i].val = i + 1; 
} 

.....(1)で、正しい値が得られます。

しかし、私は、その後の.str [i]の設定、(右上記のコードの後に​​同じ場所、)これを呼び出す場合は、空である:

for (int i = 0; i < nn; i++) { 
     string teststr = settings[i].str;  ///// (2) 
     std::cout << settings[i].str << "=" << settings[i].val << "\n"; 
    } 

...(2)、私は空の取得で。

誰かがヒントを持っていますか?ありがとう!

+1

strrは、自動保存期間を持つローカル変数です。そのスコープは、forループのブロックコードです。ループを終了した後、変数はもう生きていないので、対応するポインタは無効です。 –

+1

'const char * str'はポインタで、スコープの最後で破棄される一時的なオブジェクトを指します。何を期待していますか? –

+0

あなたはそうです。しかし、文字列の値をstrrからsettings [i] .strに永久にコピーするにはどうすればよいですか? – Steve

答えて

2

ループが終了したときに無効なメモリへのポインタを格納しているため、(1)の行が問題になります。

string strr = "thisOneIs";  // A temporary object in the loop. 
strr.append(std::to_string(i)); 
settings[i].str = strr.c_str(); // Pointer that won't be valid when the loop ends. 

あなたは、低レベルの言語機能について学習した場合、それはchar*と生のメモリを使用して実験しても大丈夫です。作業プログラムを取得しようとしている場合は、std::stringを使用してください。

また、Settingsの定義を簡略化します。 typedefはすべてC++では非意味である必要はありません。

struct Settings 
{ 
    std::string str; 
    uint val; 
}; 
+0

ありがとう! 残念なことに、このtypedefを設定に使用する必要があります。これはレガシーソフトウェア(この種のものを使用して.dll関数を呼び出す)とのインタフェースです。 文字列の値をstrrからポインタの代わりにsettings [i] .strに永久にコピーできますか? – Steve

+0

@スティーブ、その文字列をコピーする必要があります。ネットワーク上で 'strdup'を参照してください。 –

+0

char * strdup(const char * str1); str1を複製します。しかし、私の場合、私は文字列を持っています:strr。この文字列にあるものは、struct内のconst char * strに配置する必要があります:settings [i] .str ...それでは、問題は:文字列をconst char *にコピーする方法ですか? 私が誤解して申し訳ありません。 – Steve

関連する問題