2012-04-20 82 views
0

這是我簡單的程序Const char ...改變了嗎?

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中在怪異的字符串改變了嗎?

+5

我很驚訝,這段代碼編譯。你正在像一個std :: string對待一個cstring。 – SuperJames 2012-04-20 16:15:50

+1

如果您在第4行中輸出「c:\ users \ xrobot \ appdata \ Roaming \ Myapplication \ hello.txt」,我不相信這裏的代碼段是您正在運行的實際代碼。相反,我期望第二行有編譯器錯誤。我們可以看到實際的代碼嗎?從您提供的症狀中,我懷疑在您的真實代碼中,您在std :: string上調用c_str()並保留返回的指針,同時保留std :: string聲明的範圍。不要這樣做,改爲std :: string。 – moonshadow 2012-04-20 16:17:42

回答

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(); 

正是因爲表達上右邊是一個被驅逐的臨時d在表達式的末尾,並且mypath將繼續指向被破壞的對象。換句話說,它變成了一個搖晃的指針。

-

爲什麼mypath中在怪異的字符串改變了嗎?

因爲在您的發佈代碼中,mypath是一個懸掛指針,使用它會調用未定義的行爲。

這是你應該怎麼寫代碼:

std::string appData = getenv("APPDATA"); 
std::string mypath= appData+"\\MyApplication\\hello.txt"; 
cout << mypath; 
fstream file(mypath.c_str(),ios::in); 
5

你不能像這樣添加兩個字符串。您應該收到明確的警告。由於您使用的是C++,因此您可能需要使用std::string

2

這只是一個暫時的std::string

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

所以底層的C字符串空間可以表達之後被釋放用於。既然你有一個char*指向什麼是垃圾內存,你有一個時髦的價值。

+0

Ewwwwww。如果你第一次回到不安全的'strxxx'界面,使用'std :: string'有什麼意義? – 2012-04-20 16:21:38

+0

@ R.MartinhoFernandes OP似乎堅持不使用'strcat()'。他的葬禮。 – chrisaycock 2012-04-20 16:22:10

+1

請勿使用具有魔術長度的緩衝區。 – 2012-04-20 16:25:55

相關問題