Этот код демонстрирует противоположное поведение от одного вы описываете:
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
struct message5
{
uint8_t id;
uint16_t size;
uint32_t data;
uint8_t num_ids;
uint16_t ids[4];
};
#if !defined(NO_UNION)
union my_msg_union
{
struct message5 msg;
char buffer[256];
};
#endif /* NO_UNION */
struct data
{
char const *name;
size_t offset;
};
int main(void)
{
struct data offsets[] =
{
{ "message5.id", offsetof(struct message5, id) },
{ "message5.size", offsetof(struct message5, size) },
{ "message5.data", offsetof(struct message5, data) },
{ "message5.num_ids", offsetof(struct message5, num_ids) },
{ "message5.ids", offsetof(struct message5, ids) },
#if !defined(NO_UNION)
{ "my_msg_union.msg.id", offsetof(union my_msg_union, msg.id) },
{ "my_msg_union.msg.size", offsetof(union my_msg_union, msg.size) },
{ "my_msg_union.msg.data", offsetof(union my_msg_union, msg.data) },
{ "my_msg_union.msg.num_ids", offsetof(union my_msg_union, msg.num_ids) },
{ "my_msg_union.msg.ids", offsetof(union my_msg_union, msg.ids) },
#endif /* NO_UNION */
};
enum { NUM_OFFSETS = sizeof(offsets)/sizeof(offsets[0]) };
for (size_t i = 0; i < NUM_OFFSETS; i++)
printf("%-25s %3zu\n", offsets[i].name, offsets[i].offset);
return 0;
}
Образец продукции (GCC 4.8.2 на Mac OS X 10.9 Mavericks, 64-разрядная версия компиляции):
message5.id 0
message5.size 2
message5.data 4
message5.num_ids 8
message5.ids 10
my_msg_union.msg.id 0
my_msg_union.msg.size 2
my_msg_union.msg.data 4
my_msg_union.msg.num_ids 8
my_msg_union.msg.ids 10
Смещения в союзе такие же, как и смещения внутри структуры, как требует стандарт C.
Вам нужно будет дать полный компиляционный счетчик-пример, основанный на приведенном выше коде, и указать, какой компилятор и платформа вы компилируете, чтобы получить свой девиантный ответ - если вы действительно можете воспроизвести девиантный ответ.
Отметьте, что мне пришлось изменить uint8
и т.д. до uint8_t
, но я не думаю, что это имеет значение. Если это так, вам нужно указать, какой заголовок вы получите, например, uint8
.
Код обновлен для компиляции с union
или без. Вывод при компиляции с -DNO_UNION
:
message5.id 0
message5.size 2
message5.data 4
message5.num_ids 8
message5.ids 10
Не только это не стандарт C, это не разрешено ... размер каждого экземпляра структуры message5 должны быть одинаковыми. –
Можете ли вы продемонстрировать это с помощью короткой программы, которая выводит несогласованные размеры? –
Нет никаких несогласованных размеров. Я имел в виду, что когда я скомпилирован без объединения, размер отличается от того, когда я компилирую с объединением. – Myforwik