Строка в качестве члена Союза - PullRequest
1 голос
/ 28 марта 2020

Я просматривал этот код, чтобы найти ответ. Насколько я знаю, в союзах адрес памяти каждого члена одинаков. В приведенном ниже коде, если бы вместо строки был символ, это было бы легко. Но теперь я запутался .... Как значение i=259?

#include<stdio.h>
int main()
{
   union cq1
   {
        int i;
        char ch[2];
   };
   union cq1 u1;
   u1.ch[0]=3;
   u1.ch[1]=1;
   printf("%d %d %d", u1.ch[0], u1.ch[1], u1.i);
   return 0;
}

1 Ответ

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

Массив символов, например char ch[2], представляет собой массив размером 2 char с, каждый длиной 1 байт. Это означает, что в памяти это char, а затем секунда char.

. Это объединение содержит 2 типа, 32-разрядное (на моей машине) целое число и массив из 2 символов. Поскольку самый большой тип 32-битный или 4 байта, общий размер объединения составляет 4 байта. Вы можете проверить это с помощью printf("%d\r\n", sizeof(u1));

ui1.ch[0] = 3, для которого первый байт равен 3, а u1.ch[1] = 1 для второго байта, равного 1. Когда я просматриваю это в отладчике, я вижу 0x60fefc: 03 01 00 00. То есть, в ячейке памяти, соответствующей u1, есть байты 3, 1, 0 и 0. u1.i интерпретирует это как 4-байтовое целое в порядке наименьшего значащего байта (LSB). 4-байтовое целое число в формате LSB представляется в памяти в формате A B C D, где значение равно A + 256*B + 65536*C + 16777216*D (для положительных значений до 2 147 483 647). Итак, 03 01 00 00 равно 3 + 256*1, что равно 259.

...