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")再次调用以“刷新”指针。

请注意,在您的回答中,您表示 using 可以getenv_s()为您解决问题。这是因为将环境字符串复制到您提供的缓冲区中,而不是返回一个可能会在以后更改的全局状态getenv_s()的指针。_environ

于 2012-07-03T05:38:50.350 回答
0

对 getenv、putenv 或 strdup 的 [deprecated] 调用中的任何一个都存在问题。

更改为 getenv_s 和 putenv_s,消除了对 strdup 的需求并解决了问题。

于 2012-07-02T21:42:47.760 回答
0

Hello 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 回答