在VS2012上使用getenv / putenv进行内存损坏

时间:2012-07-02 21:42:47

标签: c environment-variables visual-studio-2012

在尝试运行在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

3 个答案:

答案 0 :(得分:3)

getenv()返回指向环境的进程全局副本的指针。来自MSDN:

  

getenv和_putenv使用全局变量_environ指向的环境副本来访问环境

所以var1指向那组数据。一旦调用putenv(),就会修改全局数据,并且var1指针指向已更改的内存。您需要将数据var1点复制到您自己的缓冲区中以修改环境,或再次调用var1 = getenv("var1")以“刷新”指针。

请注意,在your answer中,您表明使用getenv_s()可以解决您的问题。这是因为getenv_s()将环境字符串复制到您提供的缓冲区中,而不是返回可能在以后更改的gloabl _environ状态中的指针。

答案 1 :(得分:0)

对于getenv,putenv或strdup的任何[已弃用]调用都存在问题。

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

答案 2 :(得分: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);