0

这是我的简单程序的一部分

string appData = getenv("APPDATA");
const char *mypath= (appData+"\\MyApplication\\hello.txt").c_str();      
cout << mypath;  
// output: c:\users\xrobot\appdata\Roaming\Myapplication\hello.txt   
fstream file(mypath,ios::in);
ofstream filetemp;    
filetemp.open("world.bak");
cout << mypath;  
// output: É↕7

为什么 mypath 在那个奇怪的字符串中发生了变化?

4

3 回答 3

7

您应该std::string用作:

std::string appData = getenv("APPDATA");
std::string path = appData+"\\MyApplication\\hello.txt";

然后这样做:

const char * mypath = path.c_str();

请注意,您不能这样做:

const char* mypath = (appData+"\\MyApplication\\hello.txt").c_str();

这是因为右侧的表达式是一个临时的,它在表达式的末尾被销毁,mypath并将继续指向被销毁的对象。换句话说,它变成了一个悬空指针。

--

为什么 mypath 在那个奇怪的字符串中发生了变化?

因为在您发布的代码中,mypath是一个悬空指针,使用它会调用未定义的行为。

这就是你应该如何编写代码:

std::string appData = getenv("APPDATA");
std::string mypath= appData+"\\MyApplication\\hello.txt";
cout << mypath;  
fstream file(mypath.c_str(),ios::in);
于 2012-04-20T16:15:08.957 回答
5

你不能像这样添加两个字符串。您应该会收到明确的警告。由于您使用的是 C++,因此您可能希望改用 C++ std::string

于 2012-04-20T16:14:32.837 回答
2

这只是暂时的std::string

(appData+"\\MyApplication\\hello.txt")

因此,在使用表达式后,可以释放底层 C 字符串空间。由于您char*指向现在的垃圾内存,因此您有一个时髦的值。

于 2012-04-20T16:15:52.890 回答