Копировать структуру в массив символов

Я изучаю C и имею вопрос о структурах.

у меня есть

struct myStruct {
    char member1[16];
    char member2[10];
    char member3[4];
};

Это должно занять не менее 30 байт памяти для хранения. Можно ли скопировать все эти данные в переменную char foo[30]? Каким будет синтаксис?

6 ответов


вы не можете просто напрямую скопировать все это, потому что компилятор может произвольно решить, как разместить/упаковать эту структуру. Вам понадобится три memcpy вызовы:

struct myStruct s;
// initialize s
memcpy(foo,                                       s.member1, sizeof s.member1);
memcpy(foo + sizeof s.member1,                    s.member2, sizeof s.member2);
memcpy(foo + sizeof s.member1 + sizeof s.member2, s.member3, sizeof s.member3);

размер struct myStruct is sizeof(struct myStruct) и больше ничего. Это будет по крайней мере 30, но это может быть любое большее значение.

вы можете сделать это:

char foo[sizeof(struct myStruct)];

struct myStruct x; /* populate */

memcpy(foo, &x, sizeof x);

согласно стандарту C (6.2.6 представления типов)

4 значения, хранящиеся в объектах без битового поля любого другого типа объектов состоят из N × char_bit битов, где n-размер объекта этого типа в байтах. Значение может быть скопировано в объект типа unsigned char [n] (например,С помощью функции memcpy); результирующий набор байтов вызывается объектное представление значения.

Так вы можете написать просто

unsigned char foo[sizeof( struct myStruct )];
struct myStruct s = { /*...*/ };

memcpy( foo, &s, sizeof( struct myStruct ) );

учтите, что вы можете копировать элементы данных отдельно в один массив. Например

unsigned char foo[30];
struct myStruct s = { /*...*/ };

unsigned char *p = foo;
memcpy( p, s.member1, sizeof( s.member1 ) );
memcpy( p += sizeof( s.member1 ), s.member2, sizeof( s.member2 ) );
memcpy( p += sizeof( s.member2 ), s.member3, sizeof( s.member3 ) );

вы можете сделать следующее, Если у вас есть переменная myStruct с именем st:

strcpy(foo, st.member1);
strcat(foo, st.member2);
strcat(foo, st.member3);

довольно просто с memcpy.

char foo[30];
struct myStruct s;

s.member1 = //some data
s.member2 = //some data
s.member3 = //some data

memcpy(foo, &s, 30);

Да, это возможно.

есть разные способы сделать это. Ниже приведены два самых простых метода.

struct myStruct  myVar;

/* Initialize myVar */
...

memcpy (foo, &myVar, sizeof (myStruct));

или если вы имеете дело с указателем ...

struct myStruct *  myVarPtr;

/* Initialize myVarPtr */
...

memcpy (foo, myVarPtr, sizeof (myStruct));

обратите внимание, что при копировании структуры в/из массива символов, как это, вы должны быть очень осторожны, поскольку размеры структуры не всегда то, что вы могли бы сначала подумать. В вашем конкретном случае не может быть никаких проблем; но в целом, вы должны, по крайней мере, знать потенциальных проблем с заполнением, выравниванием и размером типа, которые могут изменить размер вашей структуры.

надеюсь, что это помогает.