Вывод следующего кода. Союз - PullRequest
0 голосов
/ 20 ноября 2010

Может кто-нибудь объяснить, почему следующий код будет печатать 20 вместо 10?

Спасибо

#include<stdio.h>

int main()
{
    union var
    {
        int a, b;
    };
    union var v;
    v.a=10;
    v.b=20;
    printf("%d\n", v.a);
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 20 ноября 2010

По определению объединения: вы не можете одновременно использовать v.a и v.b, потому что оба поля имеют один и тот же адрес.Чтобы процитировать стандарт:

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

Здесь, как только вы назначаете v.b, вы переопределяете v.a.В вашем случае все не выглядит ужасно, потому что обе переменные имеют один и тот же тип, но просто представьте, что если a был бы float и b символом, например.

Если ваша цельчтобы var была составной переменной, содержащей два разных int, тогда вы должны использовать struct, а не union.

0 голосов
/ 20 ноября 2010

Объединение - это вещь, которая обеспечивает доступ к одной и той же памяти с различными типами модификаций.Таким образом, в вашем коде первое назначение не имеет большого смысла, потому что второе назначение существует.Это влияет на память в последнем порядке, поэтому вы получите последнее назначенное значение.

0 голосов
/ 20 ноября 2010

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

Из стандарта C99, раздел 6.7.2.1:

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

Из раздела 6.5.8:

Все указатели на членов одного и того же объекта объединения сравниваются одинаково.

...