class Vars{
public:
char *appData = getenv("AppData");
string datadir = strcat(appData, "\\Bob");
};
cout << v.datadir;
输出"C:\Users\Adam\AppData\Roaming\Bob\Bob"
而不是“C:\Users\Adam\AppData\Roaming\Bob"
它总是两次添加第二个参数。怎么样?
答案 0 :(得分:2)
&#34;该函数返回的指针所指向的字符串不应被程序修改。&#34;像你一样改变值(通过strcat)会导致不可预测的行为。解决方案是将不可变的给定字符串复制到string
并在那里进行连接。
如何创建一个新的公共函数来执行此操作:
string datadir(getenv("AppData"));
datadir += "\\Bob";
这是前C ++ 11代码。
答案 1 :(得分:1)
问题是你正在修改你不应该的内存。你得到一个来自getenv
的指针,但那是指向你无法控制的记忆(强调我的)。
返回的指针指向内部存储器块,其内容或有效性可能通过进一步调用getenv而改变(但不能通过其他库函数调用)。
该函数返回的指针指向的字符串不应被程序修改。某些系统和库实现可能允许使用特定函数(putenv,setenv ...)更改环境变量,但此类功能是不可移植的。
通过调用strcat(appData, "\\Bob");
,您正在将\Bob
写入您无法控制的内存中。操作系统可以决定用它做任何事情。正如@Liviu已经指出的那样,最好是复制原始值并附加到它。
std::string appData( getEnv("AppData" ) );
appData += "\\Bob";