Структура - это память в байтовой области, в которой компилятор знает свою структуру, то есть, какие переменные вы объявляете внутри.
Например, вы можете объявить структуру:
struct st {
int number;
};
struct st n;
n.number = 10;
printf("n=%i\n", n.number);
НоВы можете изменить поведение компилятора, например, объявить указатель на char над вашей структурой:
char *c = (char*)&n;
printf("char c=%c\n", c[0]);
Это допустимое объявление.Тогда вы можете в любой момент изменить структуру этой зоны памяти.Единственная важная вещь - это адрес памяти вашей объявленной структуры.
В вашем примере, когда вы объявляете производную структуру, программа резервирует область памяти для выделения производной структуры, но форма, которую компилятор видит эту область, можетможет быть изменено в любое время:
struct derived my_derived;
struct base *b = (struct base*)&my_derived;
b->x = 20;
my_derived.y = 10;
printf("x=%i y=%i\n", my_derived.base.x, my_derived.y);
В этом случае b и & my_derived совместно используют одну и ту же область памяти, вы изменяете только то, как компилятор "видит" эту область.
Использование "типа"«Пуннинг» - это основа имитации наследия oop в C, язык программирования не oop.
Я использую эту технику в своих проектах: oop4c