C ++ доступ к переменной в структуре объединения - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю с библиотекой, структура которой определена следующим образом:

typedef struct {
    int x;
    union {
        struct {
            y;
            union {
                int z;
            } innerStruct;
            char *a;
        } middleStruct;
    int q;
    } u;
} mainStruct;

Как мне получить доступ к char * a?

Я пробовал несколько методов.Это работает:

mainStruct *myStruct;
int d = myStruct->x;

Но это не работает:

char *d = myStruct->a;

Я могу получить x штрафа, используя вышеуказанный метод, но не a.почему?

Я никогда раньше не работал с профсоюзами и вынужден использовать эту структуру как часть библиотеки, которая мне нужна.Заранее спасибо за помощь и извините, если я задаю этот вопрос.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я могу получить x штрафа, используя вышеуказанный метод, но не a.почему?

Поскольку x является членом mainStruct, а a не является.

a является членом middleStruct, который являетсячлен u, который является членом mainStruct.Вы можете получить доступ к членам экземпляров объединения, используя тот же синтаксис, что и к членам экземпляров классов, не входящих в объединение.Таким образом, вы можете написать myStruct->u.middleStruct.a

PS Поведение mainStruct->u не определено, если только вы не инициализируете mainStruct.

0 голосов
/ 11 декабря 2018

Поле x является прямым членом mainStruct, поэтому естественно, что это работает:

int d = myStruct->x;

Поле a является членом middleStruct, что является вариантомu, который является членом mainStruct.Он более глубоко вложен, чем x, поэтому вам нужно перемещаться по структуре данных следующим образом:

char *d = myStruct->u.middleStruct.a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...