为何UTF-16编码下TCHAR指针地址差值不符合预期?
问题原因解析
首先明确C/C++中指针减法的核心规则:当两个指针指向同一个数组的元素时,减法结果是两者之间的元素个数差,而非原始字节地址差。
结合你的代码场景拆解:
- 当TCHAR被解析为UTF-16编码时,每个TCHAR对应
wchar_t类型,占用2字节。 - 数组
szStr的内容TEXT("C++中文你好")包含以下TCHAR元素(含字符串终止符):'C'、'+'、'+'、'中'、'文'、'你'、'好'、'\0',共8个元素,因此sizeof(szStr) = 8 × 2 = 16字节,与代码输出一致。 - 你混淆了指针减法的结果含义:你预期的12是字节地址差(6个字符 × 2字节/字符),但代码中
lp - szStr返回的是元素个数差。如果lp指向的是'好'这个元素,它与数组起始的元素个数差应为6,对应的字节地址差是12(6 × 2)。
至于你代码中输出的差值为4,可能是以下原因之一:
- 字符计数错误:你可能误将
'好'的位置数成了第5个元素(索引4),导致元素差为4,对应字节差8,但实际'好'是第7个元素(索引6)。 - 打印格式问题:
lp - szStr的结果是ptrdiff_t(有符号整数类型),使用%u(无符号整数格式符)打印可能导致输出异常,建议改用%td格式符打印ptrdiff_t类型的值。
内容的提问来源于stack exchange,提问作者SZYoo
相关产品推荐
相关产品推荐

