You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:06:18