С* (Присваивание структур)

Модератор: Модераторы разделов

Ответить
BratSinot
Сообщения: 812
ОС: Slackware64

С*

Сообщение BratSinot »

Доброго времени суток!

Присваивание структур платформозависимо? Т.е. скажем есть структура:

Код: Выделить всё

struct __test__
{
 uint16_t a;
 int32_t b;
} n;

И если мы ей что-нибудь присвоим:

Код: Выделить всё

n = (struct __test__){0xAABB, -12};

то на разных endianness это будет правильно работать? Т.е. если big то будет {0xAABB, -12}, а если little то {-12, 0xAABB}?

С объединениями и битовыми полями понятно, они и так платформозависимы.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: С*

Сообщение NickLion »

little или big — это порядок байт в пределах одного числа. Поля struct __test__ будут располагаться в памяти по порядку описания, это чётко сказано в стандарте:
Within a structure object, the non-bit-field members and the units in which bit-fields
reside have addresses that increase in the order in which they are declared.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: С*

Сообщение eddy »

NickLion писал(а):
03.12.2012 23:18
Поля struct __test__ будут располагаться в памяти по порядку описания, это чётко сказано в стандарте:

А выравнивание? Не получится ли, что у одних два нуля добавятся после a, а у других - до?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: С*

Сообщение NickLion »

eddy писал(а):
03.12.2012 23:23
А выравнивание? Не получится ли, что у одних два нуля добавятся после a, а у других - до?

Разве это где-то мешает? Такое описание — это compound literal, а не приведение типа. Компилер расставит всё так же, как и при объявлении обычной переменной.
Спасибо сказали:
Ответить