1
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"

它总是将第二个参数添加两次。怎么来的?

4

2 回答 2

2

“此函数返回的指针所指向的字符串不应被程序修改。” 像您所做的那样更改值(通过 strcat)会导致不可预测的行为。解决方案是简单地将不可变的给定字符串复制到 astring并在那里进行连接。

如何创建一个新的公共函数来执行此操作:

string datadir(getenv("AppData"));
datadir += "\\Bob";

这是 C++11 之前的代码。

于 2013-05-30T12:47:01.490 回答
1

问题是您正在修改不应该的内存。您从 获得一个指针getenv,但它指向您无法控制的内存(强调我的)。

返回的指针指向一个内部内存块,其内容或有效性可以通过进一步调用 getenv 来改变(但不能通过其他库函数)。

此函数返回的指针所指向的字符串不应被程序修改。某些系统和库实现可能允许使用特定函数(putenv、setenv...)更改环境变量,但此类功能是不可移植的。

通过调用strcat(appData, "\\Bob");,您正在写入\Bob一段您无法控制的内存。操作系统可能决定用它做任何事情。正如@Liviu 已经指出的那样,最好复制原始值并附加到该值。

std::string appData( getEnv("AppData" ) );
appData += "\\Bob";
于 2013-05-30T13:10:28.803 回答