что sizeof () вернет, когда union находится внутри структуры в c? - PullRequest
0 голосов
/ 14 декабря 2018

Рассмотрим эту программу:

#include "stdio.h"
#include "conio.h"

void  main() {
    struct ax {
        char name[5]; //5 bytes
        union {
            float y; // 4 bytes
            int z;   // 4 bytes
        } u; // sizeof this union should be 4
    } t; //hence 4 + 5 should be 9

    printf("%d",(int)sizeof(t));

    getch();
}

Почему печатается 12?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Наиболее вероятная компоновка на 32-битной машине: 5-байтовый символ + 3-байтовое заполнение + 4-байтовое объединение = 12 байт.

Вы можете самостоятельно просмотреть макет памяти:

#include <stddef.h>
#include <stdio.h>

printf("%zu\n", offsetof(struct ax, u)); // likely prints 8
0 голосов
/ 14 декабря 2018

Простой ответ заключается в том, что структура содержит отступы, что делает ее размер (как сообщается sizeof) больше, чем сумма его частей.Заполнение между элементами структуры обычно существует для выравнивания каждого элемента структуры (например, по 32- или 64-битной границе).В конце может также быть заполнение, например, чтобы выровнять несколько последовательных структур (например, в массиве).

Соответствующие части из стандарта C11:

6.7.2.1 (Семантикаструктуры и союзы)

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

6.5.3.4 (sizeof)

… При применении к операнду, который имеет структуру или тип объединения, результатом является общее количество байтов в таком объекте, включая внутреннее и конечное заполнение.
0 голосов
/ 14 декабря 2018

Поиск выравнивания данных.Объединение было выровнено по следующему 32-битному (или 64-битному) адресу (в любом случае) через 8 байт после начала char[5].

. Отладка экземпляра (и просмотр его структуры памяти)покажет вам, как char[5] был на самом деле "дополнен" 3 дополнительными байтами.

...