我有下面的C++代码:
#include "stdafx.h"
#include <atlstr.h>
int _tmain(int argc, _TCHAR* argv[])
{
CString OFST_PATH;
TCHAR DIR_PATH[MAX_PATH];
GetCurrentDirectory(MAX_PATH, DIR_PATH);
OFST_PATH.Format(DIR_PATH);
CHAR *pOFST_PATH = (LPSTR)(LPCTSTR)OFST_PATH;
return 0;
}
我想了解为什么程序末尾的pOFST_PATH
的值是"c"?变量OFST_PATH
的(LPSTR)(LPCTSTR)
强制转换对写入其中的整个路径做了什么?
正如您在下面的窗口中所看到的,调试时变量值为:
1条答案
按热度按时间z9smfwbn1#
CString
和LPCTSTR
都基于TCHAR
,当定义UNICODE
时,TCHAR
是wchar_t
(在您的例子中,我可以通过调试器中argv
的值来判断它是wchar_t
)。这样就可以了,因为
CString
有一个到LPCTSTR
的转换操作符,但是定义了UNICODE
之后,LPCTSTR
就是LPCWSTR
,也称为wchar_t const*
。它指向一个utf16字符数组。该数组中的第一个字符是L'c'
(这是'c'
的宽字符版本)。L'c'
的字节在内存中如下所示:0x63 0x00
。这是字母'c'的ASCII码,后面跟着一个零。因此,当您将CString
转换为LPCTSTR
时,这是有效的,但是,您的下一个转换:这是无效的。
LPSTR
是char*
,因此您将wchar_t const*
视为char*
。您的调试器假设当它看到char*
时,它正在查看以空结尾的窄字符串。如果您还记得上面第一个字符的字节值是什么,它是字母'c'的ASCII值,后面跟着一个零。因此调试器将其视为仅由字母'c'组成的空终止字符串。这个故事的寓意是,如果你不明白c风格的造型是做什么的,以及它们是否合适,就不要使用它们。