Const char ...改变了吗?

时间:2012-04-20 16:12:57

标签: c++

这是我简单程序的一部分

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在那个奇怪的字符串中改变了?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:5)

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

答案 2 :(得分:2)

这只是一个临时的std::string

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

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