为什么 strcat to getenv() 会更改后续的 getenv() 调用?

Why does strcat to getenv() changes subsequent getenv() calls?

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

这是我使用的代码

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

int main()

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

打印语句的结果是

C:\Users\username\bullshit

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

注意:我在 windows 8.1 系统

上使用 32 位 minw-gcc 编译器

您不拥有 getenv 返回的字符串,您无法修改它(例如向其附加内容)。

如果需要修改,就复制到自己的内存中,可以修改,像数组一样:

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

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