const char * ведет себя странно

c++ char

86 просмотра

1 ответ

так что недавно я получил несколько действительно странных ошибок в моем проекте C ++! Я получаю строку длиной 32 символа из TCP-клиента и сохраняю ее в const char *, например так:

serverData.Salt = "";
NetDll_recv(XNCALLER_SYSAPP, Sock, serverData.Salt, 32, 0);
if (!(serverData.Salt != NULL))
    return false;
printf("Salt: %s\n", serverData.Salt);
serverData.Salt = "";

после сохранения в serverData.Salt (как вы можете видеть) я печатаю его на консоль отладки, но теперь появляется странная вещь ... Все const char * или char *, которые я объявляю как

const char* example = "";

имеют значение этого serverData.Salt, я никогда ничего не делаю с serverData.Salt, кроме строк кода, которые я разместил, поэтому я прошу помощи, потому что это испортило весь мой проект ...

Заранее спасибо :)

Кстати, это структура:

struct ServerData
{
    const char* Salt;
};
ServerData serverData;

РЕДАКТИРОВАТЬ:

Это пример: я делаю весь код, который я разместил выше, а затем в моем проекте я инициализирую переменную Score:

const char *Score = "";

Это "", потому что мне это не нужно в то время, и оно будет размещено на экране, в качестве элемента, который будет показывать счет пользователей во время игры, теперь давайте возьмем "12345" как то, что сервер вернул и записал в serverData. Соль, так что теперь, если я нахожусь в главном меню моей игры, счет должен быть "", но это "12345", хотя я никогда ничего не делал с ним в коде на данный момент ... так что он вроде получил значение serverData.Salt

Автор: Pete Источник Размещён: 08.11.2019 11:13

Ответы (1)


2 плюса

Вы не можете хранить символы "в" a const char*; Вы можете иметь только тот, const char*который указывает на некоторый буфер. В этом случае вы просите NetDll_recvсохранить его данные в буфере, который получен из строкового литерала ( ""). Плохо и неправильно!

Вы уже знаете , что это плохо и неправильно , потому что, хотя вы не сказали нам, вы должны были гипс serverData.Saltот const char*до просто char*сделать ваш код компилируется.

После того, как вы изменили память, занятую строковым литералом, все ставки отключены. Вы видите неопределенное поведение в действии, возможно, постоянное повреждение пространства памяти внутри вашего процесса, в котором хранятся строковые литеральные данные. Вот почему ценность продолжает появляться в другом месте. Чтобы добавить оскорбление к травме, вы вышли далеко за пределы исходной строки, в которой было ноль символов (не считая нулевого завершения).

Вы должны прекратить рассматривать const char*как строковые объекты. Либо используйте, std::stringкак вы, либо, по крайней мере, выделите буфер, которым вы на самом деле владеете, в котором будут храниться новые данные, и char*укажите на это.

Автор: Lightness Races with Monica Размещён: 20.08.2016 11:43
Вопросы из категории :
32x32