我有以下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"?变量(LPSTR)(LPCTSTR)转换OFST_PATH对写在其中的整个路径做了什么?
正如在下面的窗口中所看到的,在调试变量值时,如下所示:

发布于 2016-06-19 14:53:43
CString和LPCTSTR都基于TCHAR,这是定义UNICODE时的wchar_t (在您的情况下,这是根据调试器中argv的值来判断的)。当你这样做时:
(LPCTSTR)OFST_PATH这是可以的,因为CString有一个转换操作符到LPCTSTR。但是在定义了UNICODE之后,LPCTSTR就是LPCWSTR,即a.k.a。wchar_t const*。它指向一个utf16字符数组。该数组中的第一个字符是L'c' (这是'c'的宽字符版本)。L'c'的字节在内存中如下所示:0x63 0x00。这是字母'c‘的ASCII代码,后面是零。因此,当您将CString转换为LPCTSTR时,这是有效的,但是,您的下一个转换是:
(LPSTR)(LPCTSTR)OFST_PATH那是无效的。LPSTR是char*,所以你把wchar_t const*当作char*对待。那么,您的调试器假设,当它看到一个char*时,它将看到一个以空结尾的窄字符串。如果您从上面记住第一个字符的字节值,它是字母'c‘的ASCII值,后面是零。因此调试器认为这是一个以空结尾的字符串,仅由字母'c‘组成。
这个故事的寓意是,如果你不理解c风格的转换,以及它们是否合适,就不要使用它们。
https://stackoverflow.com/questions/37908311
复制相似问题