почему Char * имеет длину = 1, когда структура, содержащая вектор, копируется в него с помощью memcpy. У нас есть альтернативный подход

0

У меня есть структура, которая содержит другие вспомогательные структуры, которые хранятся в векторе. Теперь я хочу скопировать эту структуру в 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
  • 2
    Вероятно, потому что где-то в структуре 0 .
  • 0
    Зачем вам копировать vector с помощью memcpy ? Он копирует указатель (и) в память, содержащую элементы, но не сами элементы.
Показать ещё 8 комментариев
Теги:
structure
char

2 ответа

3

Второй байт в памяти t1 равен 0. t1.val является short, а 2 - short как 0x02 0x00 на вашем компьютере. Таким образом, textchar[0] равен 0x02, а textchar[1] - 0x00.

  • 0
    Спасибо за расширение, интересно, как бы я решить эту проблему?
0

strlen подсчитывает количество символов, пока не найдет нуль ('\ 0'). Поэтому, если ваши данные содержат байт, значение которого равно нулю, strlen остановится.
Первое поле t1, val является коротким int, и вы устанавливаете его на 2, поэтому в памяти будут символы 0 и 2 (или 2 и 0 в соответствии с endianess), и strlen остановится.
Обратите внимание, что при копировании вектора с memcpy вы действительно не знаете, что произойдет, вектор будет иметь внутреннее представление, содержащее указатели, чтобы вы не сохранили содержимое вектора (memcpying обратно в другую структуру, вероятно, приведет к сбоям).
Если вам нужна структура данных, которая может быть легко сериализована в буфер (и неэтериализована), я бы предложил буферы протокола google.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню