Я не уверен, что это нормально или это ошибка компилятора, но у меня есть C-структура с множеством членов. Среди них, есть,:Как сказать gcc отключить заполнение внутри структуры?
struct list {
...
...
const unsigned char nop=0x90; // 27 bytes since the begining of the structure
const unsigned char jump=0xeb; // 28 bytes since the begining of the structure
const unsigned char hlt=0xf4; // 29 bytes since the begining of the structure
unsigned __int128 i=0xeb90eb90eb90eb90f4f4 // should start at the 30th byte, but get aligned on a 16 byte boundary and starts on the 32th byte instead
const unsigned char data=0x66; // should start at the 46th byte, but start on the 48th instead.
}; // end of struct list.
У меня было трудное время, чтобы выяснить, почему моя программа не работала, но я наконец-то нашел есть зазор 2 байта между hlt
и i
, который установлен в 0x0 , Это означает, что i
выравнивается.
Это очень ясно, когда я PRINTF той части структуры, так как с:
for(int i=28;i<35;i++)
printf("%02hhX",buf[i]);
я EBF40000EB90EB90
на экране.
Я пробовал такие вещи, как volatile struct list data;
в моей программе, но это не изменило проблему выравнивания.
Значит, есть #pragma
или __attribute__
, чтобы сообщить gcc, чтобы не выровнять i
внутри struct list
?
Это похоже на синтаксическую ошибку для меня. Это C++ или что-то еще? – melpomene
Это не ошибка. В C каждый член структуры может иметь неопределенное дополнение после него. Почему это проблема? – melpomene
Посмотрите на '#pragma pack (1)', но убедитесь, что это то, что вам действительно нужно и чего хочет. – Banex