从网络数据包复制一串 wchar 时访问冲突

Access violation while copying a string of wchar from network packet

本文关键字:一串 wchar 访问冲突 网络 数据包 复制      更新时间:2023-10-16

我正在编写游戏服务器,因为我在韩国,所以它使用Unicode。问题是我无法从数据包中复制 wchar 字符串。

我检查wcsncpy_s(chat, 100, inChat.c_str(), inChat.length());这工作正常,但这样的东西不起作用。

wchar_t strId[10];  // I'm trying to copy L"player11" here.    
wcsncpy_s(
            strId,
            10,
            (WCHAR*)(buffer[2]),  // buffer[0] : packet size, buffer[1] : packet type
            9                     
        );

内存视图

检查了很多次,以找出我做错了什么,但我不知道它有什么问题。

它每次都会抛出相同的异常。

Exception thrown at 0x00007FFF20DFE5A0 (ucrtbased.dll) in SimplestMMORPG-Server.exe: 0xC0000005: Access violation reading location 0x0000000000000070.

请帮帮我...

你只需要指定从buffer开头的偏移量,而不是试图将buffer[2]解释为内存地址:

wcsncpy_s(
            strId,
            10,
            (WCHAR*)(buffer + 2),
            9                     
        );

因为:鉴于buffer被声明为 char* buffer(或 std::byte* buffer (,即缓冲区包含一个指向某个内存的指针(如屏幕截图所示(,buffer[2]从缓冲区中获取第 3 个元素。 buffer[2] 的类型为 char,而类型 charwcsncpy_s 的第 3 个参数不兼容。(从内存视图中,第 3 个字节是0x70。然后0x70作为第三个参数传递给wcsncpy_s,它期望第三个参数是内存地址,并尝试从0x70内存地址读取,并失败,这就是错误消息被Access violation reading location 0x0000000000000070的原因(

相反,您需要计算缓冲区内该字符串的地址,如buffer + 2buffer + 2的类型为 char*wcsncpy_s期望将char*作为第三个参数。