首页 > 解决方案 > 为什么 strcat 到 getenv() 会更改后续的 getenv() 调用?

问题描述

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

这是我使用的代码

#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 系统上使用 minw-gcc 编译器 32 位

标签: c++cgetenv

解决方案


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

如果您需要修改它,则将其复制到您拥有并可以修改的内存中,例如数组:

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

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


推荐阅读