хранение данных из объединения в другую переменную - PullRequest
0 голосов
/ 12 июня 2019

У меня есть код, который я пытаюсь понять.Можно ли получить 2,3,4 обратно после того, как оно сохранено в длинном целом bb?

Когда я распечатываю bb, я получаю 772. Это значение указателя?

struct char_struct
{
   unsigned char x;
   unsigned char y;
   unsigned char z;

};
union longest
{
   unsigned long int aa;
   struct char_struct b;
};

int main()
{
   unsigned long int bb = 0;
   union longest Longest;
   Longest.b.x = 2;
   Longest.b.y = 3;
   Longest.b.x = 4;
   bb = Longest.aa;
   printf("%ld",bb);
   return 0;
 }

1 Ответ

1 голос
/ 12 июня 2019

Объединения в C предлагают выбор из нескольких членов, каждый из которых сопоставлен с одной и той же ячейкой памяти. Если вы установите более одного, вы повреждаете память других участников.

Помимо этого, Longest.aa неинициализирован, поэтому вы печатаете мусорное значение.

Звучит так, будто вам нужна структура, которая предлагает «вертикальную» коллекцию элементов, которые могут быть установлены и доступны одновременно (как вы делаете с char_struct). Размер структуры, по крайней мере, является суммой всех размеров его элементов плюс любое выравнивание размера кэша , добавляемое компилятором.

Вот пример программы, иллюстрирующий некоторые из этих пунктов:

#include <stdio.h>

struct char_struct {
    unsigned char x;
    unsigned char y;
    unsigned char z;
};

struct longest_t {
    unsigned long int aa;
    struct char_struct b;
};

int main() {
    unsigned long int bb = 0;
    struct longest_t longest;
    longest.b.x = 2;
    longest.b.y = 3;
    longest.b.z = 4;
    longest.aa = 42;
    bb = longest.aa;
    printf("%ld\n", bb);
    printf("%d %d %d\n", longest.b.x, longest.b.y, longest.b.z);
    printf("longest_t size: %lu\n", sizeof(struct longest_t));
    printf("char_struct size: %lu\n", sizeof(struct char_struct));
    printf("ul int size: %lu\n", sizeof(unsigned long int));
    return 0;
}

Прогон на моей машине показывает:

42
2 3 4
longest_t size: 16
char_struct size: 3
ul int size: 8

Возможно, вы захотите typedef ваши структуры, и я предлагаю более семантически значимые имена переменных, хотя я понимаю, что это пример программы. Существует несколько соглашений для структурных имен, но обычно имена переменных не в верхнем верблюжьем регистре, как Longest.

...