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"
它总是将第二个参数添加两次。怎么来的?
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"
它总是将第二个参数添加两次。怎么来的?
“此函数返回的指针所指向的字符串不应被程序修改。” 像您所做的那样更改值(通过 strcat)会导致不可预测的行为。解决方案是简单地将不可变的给定字符串复制到 astring
并在那里进行连接。
如何创建一个新的公共函数来执行此操作:
string datadir(getenv("AppData"));
datadir += "\\Bob";
这是 C++11 之前的代码。
问题是您正在修改不应该的内存。您从 获得一个指针getenv
,但它指向您无法控制的内存(强调我的)。
返回的指针指向一个内部内存块,其内容或有效性可以通过进一步调用 getenv 来改变(但不能通过其他库函数)。
此函数返回的指针所指向的字符串不应被程序修改。某些系统和库实现可能允许使用特定函数(putenv、setenv...)更改环境变量,但此类功能是不可移植的。
通过调用strcat(appData, "\\Bob");
,您正在写入\Bob
一段您无法控制的内存。操作系统可能决定用它做任何事情。正如@Liviu 已经指出的那样,最好复制原始值并附加到该值。
std::string appData( getEnv("AppData" ) );
appData += "\\Bob";