Копировать структуру в массив символов
Я изучаю 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));
обратите внимание, что при копировании структуры в/из массива символов, как это, вы должны быть очень осторожны, поскольку размеры структуры не всегда то, что вы могли бы сначала подумать. В вашем конкретном случае не может быть никаких проблем; но в целом, вы должны, по крайней мере, знать потенциальных проблем с заполнением, выравниванием и размером типа, которые могут изменить размер вашей структуры.
надеюсь, что это помогает.