Как работает этот код - в отношении инициализации объединения в c? - PullRequest
1 голос
/ 20 марта 2012

Я получил вывод 0 2 для этой программы ..... но не знаю почему?
Пожалуйста, объясните, я думаю, что только int я инициализируется с 512.
Но как ch [1] получил значение 2.

#include <stdio.h>
int main()
{
    union a /* declared */
    {
        int i;   char ch[2];
    };
    union a z = { 512 };   

    printf("%d%d", z.ch[0], z.ch[1]);
    return 0;
}

Ответы [ 5 ]

4 голосов
/ 20 марта 2012

Объявление объединения означает, что всем его членам выделена одна и та же память.Таким образом, ваши int i и char ch[2] ссылаются на одно и то же пространство памяти - другими словами, они имеют псевдонимы.Всякий раз, когда вы меняете один, вы также меняете и другой.

Теперь, при условии, что ваши int 32-разрядные, и вы используете систему с прямым порядком байтов, такую ​​как x86, i = 512 (512== 0x00000200) фактически выглядит в памяти следующим образом:

0x00  0x02  0x00  0x00.

с первыми двумя значениями, соответствующими непосредственно 2-символьному массиву:

ch[0] ch[1]

Таким образом, вы получаете ch[0] == 0x0 иch[1] == 0x02.

Попробуйте установить i = 0x1234 и посмотрите, как это повлияет на ваш массив символов.

Исходя из вашего вопроса, возможно, вы захотите использовать struct вместо union - тогда его члены будут выделяться в памяти последовательно (один за другим).

3 голосов
/ 20 марта 2012

512 - это 0x200 в шестнадцатеричном формате, поэтому первый байт вашего объединения равен 0, а второй равен 2. Если вы не укажете, какой элемент объединения должен быть инициализирован, будет использован первый из них, int в вашем случае.

Вы получаете 2 за второй байт вашей строки, так как первый байт ch инициализируется 0, второй - 2.

1 голос
/ 20 марта 2012

вы смешиваете 'struct' с 'union'.В объединении вы собираете разные типизированные и именованные данные в одно поле (с длиной = максимум (размер данных)), к которому вы можете получить доступ, и для которого вы сами должны убедиться, что получаете правильные данные.

вашпример выделяет память для max (int, char [2]) Нет разницы, если вы говорите, что zi = 32 или z.ch [0] = ''

1 голос
/ 20 марта 2012

Простой: 512 = двоичный код 1000000000, поэтому ch [0] получит 8 нулей (при условии, что ваша система имеет младший порядковый номер), а ch [1] получит 10 часть, которая в десятичном виде равна 2.

0 голосов
/ 20 марта 2012

Вы получили 0 2 по уважительным причинам, но стандарт C говорит, что поведение не определено.Если вы напишите i, то значение ch может быть теоретически любым.

Однако gcc гарантирует, что данные будут хорошо выровнены.

...