【问题标题】:Why does strcat to getenv() changes subsequent getenv() calls?为什么 strcat 到 getenv() 会更改后续的 getenv() 调用?
【发布时间】:2020-01-27 09:29:39
【问题描述】:

我在我的 c 代码中使用getenv()

这是我使用的代码

#include<windows.h>
#include<stdio.h>

int main()

{
    char *path=getenv("USERPROFILE");
    strcat(path,"\\bullshit");
    char *newpath=getenv("USERPROFILE");
    printf("%s",newpath);
}

print语句的结果是

C:\Users\username\bullshit

为什么getenv()对环境变量的调用会因为strcat而改变?

注意:我在 windows 8.1 系统上使用 minw-gcc 编译器 32 位

【问题讨论】:

  • 是的,我明白了。谢谢。
  • 根据 C 标准,修改 getenv() 返回的字符串 - 例如,通过使用 strcat() 向其附加一些内容 - 会产生未定义的行为。实际上,如果getenv() 在内部使用static 指针,strcat() 的效果可能是修改getenv() 的其他调用看到的字符串——因为它们可能都返回相同的指针。

标签: c++ c getenv


【解决方案1】:

getenv 返回的字符串不是您所有,您不能修改它(例如向其附加某些内容)。

如果你需要修改它,那么将它复制到你自己的内存中并且可以修改,就像一个数组:

char path[PATH_MAX];
strcpy(path, getenv(...));
strcat(path, ...);

如前所述,这可能导致缓冲区溢出,因此更安全的方法是使用strncpy。但是请记住,在某些情况下它不会添加字符串空终止符,因此需要显式添加。

【讨论】:

  • 注意:有人可以通过将 USERPROFILE 设置为比 PATH_MAX 更长的值(它不需要是有效路径)来使此代码崩溃
  • @Hasturkun 只不过它只为字符串本身分配了足够的内存,所以不能追加。
  • Linux 等系统也支持更长的路径,因此使用 strlen 动态分配足够长的缓冲区会更好。
猜你喜欢
  • 2017-01-08
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多