В GCC C, как я могу получить массив упакованных структур, где каждая запись в массиве выровнена?Как получить выровненный массив упакованных структур в GCC C?
(FWIW, это на PIC32, используя архитектуру MIPS4000).
У меня есть это (упрощенный):
typedef struct __attribute__((packed))
{
uint8_t frameLength;
unsigned frameType :3;
uint8_t payloadBytes;
uint8_t payload[RADIO_RX_PAYLOAD_WORST];
} RADIO_PACKET;
RADIO_PACKETs упакованы внутри.
Тогда я RADIO_PACKET_QUEUE, который представляет собой очередь RADIO_PACKETs:
typedef struct
{
short read; // next buffer to read
short write; // next buffer to write
short count; // number of packets stored in q
short buffers; // number of buffers allocated in q
RADIO_PACKET q[RADIO_RX_PACKET_BUFFERS];
} RADIO_PACKET_QUEUE;
Хочу каждый RADIO_PACKET в массиве д [], чтобы начать в выровненном адресе (по модулю 4 адреса).
Но сейчас GCC не выравнивает их, поэтому я получаю исключения адреса при попытке прочитать q [n] в качестве слова. Например, это дает исключение:
RADIO_PACKET_QUEUE rpq;
int foo = *(int*) &(rpq.q[1]);
Возможно, это из-за того, как я объявил RADIO_PACKET в упакованном виде.
Я хочу, чтобы каждый RADIO_PACKET оставался упакованным внутри, но хотел бы, чтобы GCC добавлял отступы по мере необходимости после каждого элемента массива, чтобы каждый RADIO_PACKET начинался с выровненного адреса.
Как я могу это сделать?
C мандаты, что массивы состоят из * смежных * последовательностей объектов. –
Почему вы объявляете 'RADIO_PACKET' как упакованную, когда проблема несоосности является проблемой? Вы понимаете, что упакованные структуры не очень полезны на платформах, где запрещен неправильный доступ к памяти, поскольку элементы упакованных структур не выровнены? – fuz
'* (int *) & (все, что не является int)' провоцирует неопределенное поведение и * будет * ошибочно оптимизировано текущими компиляторами. – zwol