从网络数据包中复制一串 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
,而类型 char
与 wcsncpy_s
的第三个参数不兼容。 (从内存视图来看,第 3 个字节是 0x70。然后 0x70 作为第三个参数传递给 wcsncpy_s
,它期望第 3 个参数是内存地址,并尝试从 0x70
内存地址读取,并失败,这就是为什么错误消息是 Access violation reading location 0x0000000000000070
)
相反,您需要计算该字符串在缓冲区内的地址,因为 buffer + 2
,buffer + 2
的类型为 char*
。 wcsncpy_s
期望 char*
作为第三个参数。
我正在编写游戏服务器程序,因为我在韩国,所以它使用 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
,而类型 char
与 wcsncpy_s
的第三个参数不兼容。 (从内存视图来看,第 3 个字节是 0x70。然后 0x70 作为第三个参数传递给 wcsncpy_s
,它期望第 3 个参数是内存地址,并尝试从 0x70
内存地址读取,并失败,这就是为什么错误消息是 Access violation reading location 0x0000000000000070
)
相反,您需要计算该字符串在缓冲区内的地址,因为 buffer + 2
,buffer + 2
的类型为 char*
。 wcsncpy_s
期望 char*
作为第三个参数。