多字节环境上 TCHAR[2] 的 sizeof 有关问题
多字节环境下 TCHAR[2] 的 sizeof 问题
非 Unicode 编译环境,碰到有个有意思的问题,在一段程序代码中这样的代码:
但是如果调用个函数,比如另外写个函数
//如果把第一段代码的 szString 作为参数传递进来,比如这样:
就会惊奇的发现 uLength2 = 4 !太神奇了
这是什么原因呢?
------解决方案--------------------
非 Unicode 编译环境下,TCHAR==char 占1个字节,LPTSTR是个指针占4个字节。
------解决方案--------------------
参数是指针,sizeof会判断为指针大小。数组为元素个数乘以元素大小
------解决方案--------------------
你就光给个指针是没办法的,再多给个参数表示长度吧
------解决方案--------------------
xxx::ReadString(LPTSTR lpszText, UINT uMax)
{
UINT uLength2 = sizeof(lpszText) / sizeof(TCHAR); //这里问题
}
TCHAR szString[2] = {0};
LPTSTR lpszText = szString
sizeof(szString) == 2;
sizeof(lpszText) == 4;
之所以不同,是因为sizeof会测试类型,
szString会被测试成数组类型,返回的是。元素个数*每个元素类型的字节数。
所以sizeof。所以sizeof的结果为2,sizeof(THCAR)为1. 结果为2,是正确的。代表有两个TCHAR,每个TCHAR占据1个字节。
而lpszText 则被测试为纯粹的指针。sizeof返回的指针本身所占据的字节数,不管这个指针指向任何类型的数据,指针类型本身的大小是4个字节。所以你才会得到4.
如果你要得到传入参数的大小,
UINT uLength2 = _tcslen(lpszText) * sizeof(TCHAR);
------解决方案--------------------
如果是这样,我建议你使用_bstr_t也就是BSTR类型来传参,_bstr_t有个属性长度length。即使字符串内容全是\0也能够正确记录长度。
非 Unicode 编译环境,碰到有个有意思的问题,在一段程序代码中这样的代码:
- C/C++ code
TCHAR szString[2] = {0}; UINT uLength1 = sizeof(szString) / sizeof(TCHAR); //这里 uLength1 = 2, 结果是正确的
但是如果调用个函数,比如另外写个函数
- C/C++ code
xxx::ReadString(LPTSTR lpszText, UINT uMax) { UINT uLength2 = sizeof(lpszText) / sizeof(TCHAR); //这里问题 }
//如果把第一段代码的 szString 作为参数传递进来,比如这样:
- C/C++ code
xxx::ReadString(szString, 2);
就会惊奇的发现 uLength2 = 4 !太神奇了
这是什么原因呢?
------解决方案--------------------
非 Unicode 编译环境下,TCHAR==char 占1个字节,LPTSTR是个指针占4个字节。
------解决方案--------------------
参数是指针,sizeof会判断为指针大小。数组为元素个数乘以元素大小
------解决方案--------------------
你就光给个指针是没办法的,再多给个参数表示长度吧
------解决方案--------------------
xxx::ReadString(LPTSTR lpszText, UINT uMax)
{
UINT uLength2 = sizeof(lpszText) / sizeof(TCHAR); //这里问题
}
TCHAR szString[2] = {0};
LPTSTR lpszText = szString
sizeof(szString) == 2;
sizeof(lpszText) == 4;
之所以不同,是因为sizeof会测试类型,
szString会被测试成数组类型,返回的是。元素个数*每个元素类型的字节数。
所以sizeof。所以sizeof的结果为2,sizeof(THCAR)为1. 结果为2,是正确的。代表有两个TCHAR,每个TCHAR占据1个字节。
而lpszText 则被测试为纯粹的指针。sizeof返回的指针本身所占据的字节数,不管这个指针指向任何类型的数据,指针类型本身的大小是4个字节。所以你才会得到4.
如果你要得到传入参数的大小,
UINT uLength2 = _tcslen(lpszText) * sizeof(TCHAR);
------解决方案--------------------
如果是这样,我建议你使用_bstr_t也就是BSTR类型来传参,_bstr_t有个属性长度length。即使字符串内容全是\0也能够正确记录长度。