У меня есть структура, которая содержит другие вспомогательные структуры, которые хранятся в векторе. Теперь я хочу скопировать эту структуру в char *. Я сделал через memcpy.
ON, я обнаружил, что char * имеет lenght = 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, &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
Второй байт в памяти t1
равен 0. t1.val
является short
, а 2 - short
как 0x02 0x00
на вашем компьютере. Таким образом, textchar[0]
равен 0x02, а textchar[1]
- 0x00.
strlen подсчитывает количество символов, пока не найдет нуль ('\ 0'). Поэтому, если ваши данные содержат байт, значение которого равно нулю, strlen остановится.
Первое поле t1, val является коротким int, и вы устанавливаете его на 2, поэтому в памяти будут символы 0 и 2 (или 2 и 0 в соответствии с endianess), и strlen остановится.
Обратите внимание, что при копировании вектора с memcpy вы действительно не знаете, что произойдет, вектор будет иметь внутреннее представление, содержащее указатели, чтобы вы не сохранили содержимое вектора (memcpying обратно в другую структуру, вероятно, приведет к сбоям).
Если вам нужна структура данных, которая может быть легко сериализована в буфер (и неэтериализована), я бы предложил буферы протокола google.
0
.vector
с помощьюmemcpy
? Он копирует указатель (и) в память, содержащую элементы, но не сами элементы.