Нарушение доступа при копировании строки wchar из сетевого пакета - PullRequest
1 голос
/ 09 июня 2019

Я программирую на игровом сервере, и он использует 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                     
        );

Памятьview

Я проверял много раз, чтобы выяснить, что я сделал неправильно, но я понятия не имею, что с этим не так.

Он выдает одно и то же исключение каждый раз.

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

Пожалуйста, помогите мне ...

1 Ответ

0 голосов
/ 09 июня 2019

Вам нужно просто указать смещение от начала buffer, вместо того, чтобы пытаться интерпретировать buffer[2] как адрес памяти:

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

Потому что: учитывая, что buffer объявлен как char* buffer (или std::byte* buffer), то есть буфер содержит указатель на некоторую память (показано на скриншоте), 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* в качестве третьего параметра.

...