Допустим, у меня есть тип структуры:Initializing одну структуру с содержанием другой структуры
typedef struct
{
int a;
int b[3];
int c;
} __attribute__((packed)) foo_t;
И я инициализировать таким образом:
foo_t first = { 1, { 2, 3, 4 }, 5 };
Теперь я хочу, чтобы создать вторую структуру, которая является подмножеством из первого:
typedef struct
{
int b[3];
int c;
} __attribute__((packed)) bar_t;
bar_t second = { first.b[3], first.c }; //this should define first.c as 5
memcpy(second.b, first.b, 3 * sizeof(int));
Если напечатать значения каждой переменной в second
массив b
определяется правильно, но c
всего 0.
printf("%d %d %d %d\n", second.b[0], second.b[1], second.b[2], second.c);
выходы
2 3 4 0
Почему не second.c
получить заселена правильно?
.., который все еще оставляет вопрос о том, какое значение 'first.b [3]' как 'b' имеет только три элемента и вы копируете четвертый элемент. Обратите внимание, что инициализатор является значением, а не определением. –
Да, хороший момент. Я понимаю, о чем вы говорите. Что я мог бы заменить 'first.b [3]' в этом контексте, чтобы выступать в качестве «держателя места», пока не сделаю memcpy на следующей строке? Обратите внимание, что в реальном коде, над которым я работаю, массив большой, поэтому явным образом набираю '{first.b [0], first.b [1], first.b [2], first.b [3], first.b [4] .... etc} 'будет несостоятельным. –
Я считаю, что в инициализаторе все элементы, не упомянутые специально, равны нулю, поэтому '{{0}, first.c}' должен делать трюк. Пожалуйста, проверьте его. –