назначение и управление массивом символов - PullRequest
0 голосов
/ 10 августа 2009

Я должен написать библиотеку на c ++, которая должна обрабатывать соединения с сетью kad. Я пытаюсь собрать пакет в соответствии с используемыми aMule & co.

И я действительно не могу понять разницу между этим кодом:

buffer = "\xe4\x20\x02";

и, например, этот код:

char p_buffer[36];
p_buffer[0] = 0xe4;
p_buffer[1] = 0x20;
p_buffer[2] = 0x02;

buffer = p_buffer;

(буфер является закрытым атрибутом класса, а p_buffer является локальной переменной)

захват пакетов с помощью wireshark дает мне разные результаты (первый правильный, как я хотел, второй - нет), как будто я делал что-то не так с небольшими порядковыми номерами / большими порядковыми номерами, я думаю ...

и почему в конструкторе класса я не могу изменить [private] «char * buffer» следующим образом:

buffer[0] = 0xe4;

? (не работает, выходит без какой-либо ошибки возврата)

(если это имеет значение, я использую Crypto ++ и библиотеки повышения)

Заранее спасибо за любую помощь_

Ответы [ 3 ]

6 голосов
/ 10 августа 2009

Ваш первый пример кода примерно эквивалентен:

static const char buffer_internal[4] = { 0xe4, 0x20, 0x02, 0x00 };
buffer = buffer_internal;

Два различия здесь:

  • Буфер завершен нулем
  • Буфер не подлежит изменению. Попытка изменить его может привести к сбою.

Ваш второй пример выделяет 36-байтовый модифицируемый буфер. Однако указанный буфер также будет отброшен, когда он выйдет из области видимости - будьте очень осторожны, чтобы он не использовался после освобождения.

Что касается третьего примера, инициализировали ли вы «буфер», если это указатель? Вы не предоставили достаточно информации, чтобы действительно диагностировать вашу ошибку - было бы полезно полное объявление класса и конструктор.

2 голосов
/ 10 августа 2009

Просто предложение - если вы уже используете Boost, посмотрите boost::array для упрощенного управления буфером фиксированной длины и boost::shared_array для работы с переменной- длина буфера.

2 голосов
/ 10 августа 2009

"" литералы имеют неявное NUL-завершение, если они не ограничены явной длиной массива (не в этом случае).

Также во втором случае, поскольку p_buffer - это локальная переменная, то есть автоматическая переменная, размещенная в стеке, ее содержимое не инициализируется нулем или чем-либо еще, но будет содержать любой мусор, присутствующий в базовой памяти стека.

...