我相信以下內容有一個合理的解釋,但我仍然有點困惑。用堆字符串連接堆棧字符串給出奇怪的結果
問題是一個函數創建一個_TCHAR[CONSTANT]
,一個_TCHAR*
,連接它們並返回結果。
由於某種原因,從_tmain()
調用whatTheHeck()
返回亂碼。
_TCHAR* whatTheHeck(_TCHAR* name) {
_TCHAR Buffer[BUFSIZE];
DWORD dwRet;
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
_TCHAR* what = new _TCHAR[BUFSIZE];
what = _tcscat(Buffer, TEXT("\\"));
what = _tcscat(what, name);
return what;
}
int _tmain(int argc, _TCHAR* argv[]) {
_TCHAR* failure = whatTheHeck(TEXT("gibberish);")); // not again ..
_tprintf(TEXT("|--> %s\n"), failure);
_TCHAR* success = createFileName(TEXT("readme.txt")); // much better
_tprintf(TEXT("|--> %s\n"), success);
return 0;
}
相比之下,當與堆事情一起工作如預期。
_TCHAR* createFileName(_TCHAR* name) {
_TCHAR* Buffer = new _TCHAR[BUFSIZE];
DWORD dwRet;
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
Buffer = _tcscat(Buffer, TEXT("\\"));
Buffer = _tcscat(Buffer, name);
return Buffer;
}
爲什麼不同?
難道是因爲_tcscat()
連接內存地址而不是它們的內容並返回清除堆棧?
分配內存'what'指向泄漏,而不是亂碼的原因。 –
我假設'_tcscat'像'strcat'一樣工作,在這種情況下,結果的賦值應該可以,儘管冗餘(目標指針不會被修改)。 – visitor
它像'strcat'一樣工作。 –