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

Access violation while copying a string of wchar from network packet

我正在编写游戏服务器程序,因为我在韩国,所以它使用 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                     
        );

Memory view

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

每次都抛出相同的异常。

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),即缓冲区包含 pointer 到某些内存(如屏幕截图所示),buffer[2] 从缓冲区中取出第 3 个元素。 buffer[2] 的类型为 char,而类型 charwcsncpy_s 的第三个参数不兼容。 (从内存视图来看,第 3 个字节是 0x70。然后 0x70 作为第三个参数传递给 wcsncpy_s,它期望第 3 个参数是内存地址,并尝试从 0x70 内存地址读取,并失败,这就是为什么错误消息是 Access violation reading location 0x0000000000000070)

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