为何WinAPI允许将wchar_t当作char使用?mywcslen未提前终止原因
为什么mywcslen函数没有在第一个00字节处终止?
核心原因是你混淆了wchar_t类型的宽度与内存访问逻辑,结合Windows平台的特性,具体拆解如下:
1. Windows下wchar_t的本质
Windows平台中,wchar_t是16位宽的字符类型,每个wchar_t实例占用2个字节。而宽字符串的终止符是16位的L'\0'(即两个连续的0字节组成的16位0值),并非单字节的'\0'。
2. 你的代码实际执行逻辑
你的mywcslen函数里,s[len]是按wchar_t类型访问数组元素:
- 对于"Hello"的UTF-16编码,对应的
wchar_t数组元素是0x0048、0x0065、0x006c、0x006c、0x006f(每个都是16位非零值) - 循环判断的是整个16位元素是否为0,而非单个字节。所以每个元素都满足非零条件,循环会一直走到数组末尾的16位终止符
0x0000才停止。
3. 你误解的核心点
你以为会在第一个00字节终止,是把wchar_t当成了单字节的char来处理:
- 内存中Windows用小端字节序存储
wchar_t,所以0x0048会被存为0x48(低字节)+0x00(高字节),但你的代码是通过wchar_t*访问,编译器会自动把两个字节组合成正确的16位值,不会单独读取单个字节。 - 若要触发你预期的错误行为,需要强制将
wchar_t*转为char*逐个字节访问,比如这段代码:
size_t CDECL bad_wcslen(wchar_t * s) { char* byte_ptr = (char*)s; size_t len = 0 ; while(byte_ptr[len]){ ++len ; } return len ; }
它会在第一个00字节处终止,返回1。
内容的提问来源于stack exchange,提问作者ethercod3
相关产品推荐
相关产品推荐

