работа союза - PullRequest
       16

работа союза

0 голосов
/ 04 февраля 2010

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

Ответы [ 6 ]

3 голосов
/ 04 февраля 2010

Вы правы. Память перезаписана , поскольку все элементы занимают одинаковое пространство. Взгляните на это:

union foo{
    int i;
    char[4] carr;
};

Предполагая, что целое число равно 4 байта, а char равно 1 байту, при изменении целого числа все четыре элемента массива char будут изменены.

Я бы настоятельно рекомендовал написать свой собственный небольшой код (с соответствующими printf s), чтобы понять работу объединения. Так ты научишься быстрее.

3 голосов
/ 04 февраля 2010

Я думаю, вы можете быть смущены тем, что такое union.

Эти страницы MSDN здесь (c) и здесь (C ++) углубляются в детали, но в основном объединение - это механизм, в котором тот же адрес памяти может ссылаться по-разному в зависимости от обстоятельств:

union sign   /* A definition and a declaration */
{
    int svar;
    unsigned uvar;
} number;

В этом примере определяется переменная объединения типа знак и объявляет переменную именованный номер, состоящий из двух членов: svar, целое число со знаком, и uvar, an целое число без знака. Эта декларация включает текущее значение числа в храниться как подписанное значение или значение без знака. Тег, который является связанный с этим типом объединения знак.

1 голос
/ 04 февраля 2010

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

0 голосов
/ 05 февраля 2010

Они перезаписываются , т. Е. Каждый раз, когда вы назначаете одного члена профсоюза, вы меняете другого. Это на самом деле цель объединения в C - иметь возможность иметь различные напечатанные представления для одинаковых битов в памяти . Классический пример - проверка endiannes платформы во время выполнения (глупо, но наглядно):

union duo
{
    uint16_t short_;
    uint8_t  bytes[2];

} the_duo;

/* will assign either bytes[0] or bytes[1]
 * depending on the architecture */
the_duo.short_ = 1;

if ( the_duo.bytes[0] )
    printf( "little endian\n" );
else if ( the_duo.bytes[1] )
    printf( "big endian\n" );
else
    printf( "where am i?\n" );

0 голосов
/ 04 февраля 2010

Это не более чем способ просмотра или интерпретации памяти, лежащей в основе структуры объединения. то есть эти 4 байта являются целым числом, или указателем, или вносят вклад в двойное число и т. д.? (например). Следовательно, запись в ваш int повлияет на значение вашего указателя или на ваш double.

И да - запись значения в перезапишет предыдущее значение - как обычная структура (или что-то еще).

0 голосов
/ 04 февраля 2010

Вы, кажется, трудитесь из-за неправильного понимания.

Присвоение нового значения другого типа делает перезаписыванием существующих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...