0

VS2012でコンパイルされた次のコードを実行しようとすると、メモリが破損しているようです。

VS2010以前では正常に動作します。

char *var1 = getenv("var1");  // Value for var1 is correct here

char var2S[MAXSTRING];

sprintf(var2S, "VAR2=%s/a/%s/b", var1, getValue());  //Var2 looks correct

static const char *env_string = strdup(const_cast<char *>(var2S));

putenv((char *)env_string); // Value for var1 is corrupt after this call
4

3 に答える 3

3

getenv()環境のプロセスグローバルコピーへのポインタを返します。MSDNから:

getenvと_putenvは、グローバル変数_environが指す環境のコピーを使用して環境にアクセスします

したがってvar1、そのデータセット内を指します。を呼び出すとputenv()、そのグローバルデータが変更され、var1ポインタは変更されたメモリを指しています。var1環境を変更するために、データポイントを独自のバッファーにコピーするかvar1 = getenv("var1")、ポインターを「更新」するために再度呼び出す必要があります。

あなたの答えでは、使用すると問題が解決することを示していることに注意してくださいgetenv_s()。これは、後で変更される可能性のあるgetenv_s()gloabl_environ状態のポインターを返す代わりに、指定したバッファーに環境文字列をコピーするためです。

于 2012-07-03T05:38:50.350 に答える
0

これは、getenv、putenv、またはstrdupへの[非推奨]呼び出しのいずれかに問題がありました。

getenv_sとputenv_sに変更すると、strdupが不要になり、問題も修正されました。

于 2012-07-02T21:42:47.760 に答える
0

こんにちはgetenv()は静的メモリで動作します。2回の呼び出しが最初の呼び出しメモリを上書きします。したがって、独自に割り当てられた変数で結果を取得します。

char a[512];
char b[512];

strcpy(a, getenv("a"));
strcpy(b, getenv("b"));
printf("a=[%s]\n", a);
printf("b=[%s]\n", b);
于 2012-07-02T21:49:52.540 に答える