#c #c #char #structure
#c #c #char #структура
Вопрос:
У меня есть структура, которая содержит другие вложенные структуры, которые хранятся в vector . Теперь я хочу скопировать эту структуру в char * . Я сделал через memcpy .
При отладке я обнаружил, что char * имеет длину = 1? почему это?
ниже мой пример
struct test_A
{
char a;
char b;
char c;
char d;
};
struct st_main
{
short int val;
short int val1;
std::vector< test_A> sub;
};
int main()
{
st_main t1;
t1.val = 2;
t1.val1= 2;
test_A test;
test.a = 'A';
test.b = 'A';
test.c = 'A';
test.d = 'A';
test_A test2;
test2.a = 'B';
test2.b = 'B';
test2.c = 'B';
test2.d = 'B';
t1.sub.push_back( test2 );
t1.sub.push_back( test );
char textchar[70];
std::cout << " the len of struct --> " <<sizeof( t1 ) << std::endl;
memcpy( textchar, amp;t1, sizeof( t1) );
std::cout << " the len of textchar --> " << strlen( textchar ) << std::endl;
return 0;
}
o/p:
the len of struct --> 24
the len of textchar --> 1
Комментарии:
1. Вероятно, потому, что где-то в структуре есть
0
.2. Зачем вам копировать
vector
сmemcpy
? Он копирует указатели в память, содержащую элементы, но не сами элементы.3. @juanchopanza, ну, я так не думаю, что я хваю ноль здесь, но в реальном коде да, unsigned char также может иметь значение 0
4. У вас есть
0
. Ноstrlen
это не тот инструмент, который нужно использовать здесь.5. Это очень расплывчатое описание вашей проблемы. Пожалуйста, более подробно расскажите о том, в чем именно заключается ваша проблема. Но не здесь, в другом посте. На вопрос в этом посте уже был дан ответ.
Ответ №1:
Второй байт в t1
памяти равен 0. t1.val
это short
, а 2 хранится в short
as 0x02 0x00
на вашем компьютере. Таким образом, textchar[0]
равно 0x02 и textchar[1]
равно 0x00.
Комментарии:
1. Спасибо за разъяснение, интересно, как бы мне решить эту проблему?
Ответ №2:
strlen подсчитывает количество символов, пока не найдет ноль (‘ 0’). Итак, если ваши данные содержат байт, значение которого равно нулю, strlen остановится.
первое поле t1, val — это короткое значение int, и вы устанавливаете его равным 2, поэтому у вас будут символы 0 и 2 (или 2 и 0 в зависимости от последовательности) в памяти, и strlen остановится.
Обратите внимание, что при копировании вектора с помощью memcpy вы на самом деле не знаете, что произойдет, вектор будет иметь внутреннее представление, содержащее указатели, так что вы не будете сохранять содержимое вектора (возврат к другой структуре, вероятно, приведет к сбоям).
Если вам нужна структура данных, которую можно легко сериализовать в буфер (и не сериализовать из), я бы предложил буферы протокола Google.