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

#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.