Но как все работает (включая оператор '->'), когда размер sizeof и фактический размер объекта не совпадают?
Простой: это не так. Вы солгали реализации и поэтому вызвали неопределенное поведение.
Во-первых, вы никогда не создавали объект header
в памяти; Вы просто бросаете кусок памяти в этот header
объект. Таким образом, у вас есть указатель, который не указывает на объект, но вы притворяетесь, что он делает.
Во-вторых, даже если вы попытались создать объект header
в этой памяти должным образом (или, наоборот, вы используя неявные правила создания C ++ 20), определение malloc
не требует, чтобы оно возвращало достаточно места, чтобы вместить больше указанного вами байта. Поскольку sizeof(header)
равно 16, а вы запросили только 9, ваш код будет работать только в реализациях mallo c, которые сделают доступным 16 или более байтов вашему коду при запросе 9 (на самом деле это не редкость) , В противном случае вы создаете объект, который занимает больше памяти, чем доступно через этот указатель, который также является UB.
Избавиться от чего-либо - это не то же самое, что «работать».