首页
学习
活动
专区
圈层
工具
发布

LPSTR解释
EN

Stack Overflow用户
提问于 2016-06-19 14:31:43
回答 1查看 10.6K关注 0票数 2

我有以下c++代码:

代码语言:javascript
复制
#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对写在其中的整个路径做了什么?

正如在下面的窗口中所看到的,在调试变量值时,如下所示:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-19 14:53:43

CStringLPCTSTR都基于TCHAR,这是定义UNICODE时的wchar_t (在您的情况下,这是根据调试器中argv的值来判断的)。当你这样做时:

代码语言:javascript
复制
(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时,这是有效的,但是,您的下一个转换是:

代码语言:javascript
复制
(LPSTR)(LPCTSTR)OFST_PATH

那是无效的。LPSTRchar*,所以你把wchar_t const*当作char*对待。那么,您的调试器假设,当它看到一个char*时,它将看到一个以空结尾的窄字符串。如果您从上面记住第一个字符的字节值,它是字母'c‘的ASCII值,后面是零。因此调试器认为这是一个以空结尾的字符串,仅由字母'c‘组成。

这个故事的寓意是,如果你不理解c风格的转换,以及它们是否合适,就不要使用它们。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37908311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档