在尝试运行在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
答案 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);