LINUX.ORG.RU

История изменений

Исправление uuwaan, (текущая версия) :

Структуру можно представить себе в виде проволочной сеточки. Ты накладываешь её на массив байт, и в ячейках сетки видишь какие-то значения.

void *p;
struct my_struct *my;
...
my = (struct my_struct *)p;

Такая конструкция позволяет разобрать область памяти, на которую ссылается p как структуру, и решить, нужные это данные, или нет.

При такой работе со структурами есть засада: выравнивание полей структуры в памяти. Делается это ради оптимизации по скорости. Структура получается с «дырами» между полями, что не подходит, если ты хочешь разобрать в виде структуры массив, поля в который были уложены строго друг за другом.

Запретить выравнивание конкретной структуры:

#pragma pack(push, 1)
struct my_struct
{
};
#pragma pack(pop)

Исходная версия uuwaan, :

Структуру можно представить себе в виде проволочной сеточки. Ты накладываешь её на массив байт, и в ячейках сетки видишь какие-то значения.

void *p;
struct my_struct *my;
...
my = (struct my_struct)p;

Такая конструкция позволяет разобрать область памяти, на которую ссылается p как структуру, и решить, нужные это данные, или нет.

При такой работе со структурами есть засада: выравнивание полей структуры в памяти. Делается это ради оптимизации по скорости. Структура получается с «дырами» между полями, что не подходит, если ты хочешь разобрать в виде структуры массив, поля в который были уложены строго друг за другом.

Запретить выравнивание конкретной структуры:

#pragma pack(push, 1)
struct my_struct
{
};
#pragma pack(pop)