Указатели внутри объединения используют одну и ту же область памяти? - PullRequest
2 голосов
/ 10 марта 2020

Я просматривал статью , чтобы узнать о объединении, и я понял, что размер объединения зависит от наибольшего размера переменной и переменные разделяют одну и ту же память. Таким образом, концепция была довольно ясна для меня, но в статье автор сказал, что использование «объединения» для двоичного дерева имеет смысл, когда в нем есть два указателя, указывающих на два других дочерних элемента. У меня возник вопрос: «Каковы применения союза?» раздел этой статьи, каковы будут возможные объяснения указателей внутри союза? Ссылка приведена ниже.

https://www.geeksforgeeks.org/union-c/

Итак, вот и все. Есть кто-нибудь, кто может мне помочь?

Ответы [ 3 ]

8 голосов
/ 10 марта 2020

в статье автор сказал, что использование «объединения» для двоичного дерева имеет смысл, когда у него есть два указателя, чтобы указать два других дочерних элемента… каковы будут возможные объяснения указателей внутри объединения?

Я полагаю, вы говорите об этом фрагменте кода:


struct NODE { 
    bool is_leaf; 
    union { 
        struct
        { 
            struct NODE* left; 
            struct NODE* right; 
        } internal; 
        double data; 
    } info; 
}; 

Вы неправильно поняли намерения автора здесь. Они используют объединение для реализации двух разных типов узлов в дереве: внутреннего узла, у которого есть левый и правый указатель, и конечного узла, у которого есть данные. Этот союз разделяет память между struct и double. не разделяет память между левым и правым указателями.

0 голосов
/ 10 марта 2020

Я бы также добавил, что я действительно не согласен с этим автором. Просто определите struct с двумя указателями и данными, и все будет готово. Используйте calloc(), чтобы получить структуру и установить все двоичные нули. Больше нет смысла «сохранять несколько байтов памяти». Если вы используете union таким образом, вы собираетесь испортить и тратить много времени на отладку.

0 голосов
/ 10 марта 2020

§6.7.2.1 - 16 ISO / IEC 9899: 2017

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

Так что да, все члены профсоюза, будь то указатели или другие, имеют один и тот же адрес, который согласуется с тем, как работают профсоюзы.

Проверено здесь:

https://wandbox.org/permlink/XdGY4Mrz0gQCfrbv

...