История изменений
Исправление 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)