после выдержки из здесь
pw = (widget *)malloc(sizeof(widget));
выделяет необработанное хранилище. Действительно, вызов malloc выделяет хранилище достаточно большой и , подходящим для размещения объекта типа виджет
также см. быстрый pImpl от травяного саттера, он сказал:
Alignment. Любое выравнивание памяти. Любая память, выделенная динамически через новый или malloc гарантированно правильно выровнены для объекты любого типа, но буферы, которые не распределяются динамически не имеют такой гарантии
Мне интересно, как malloc знает выравнивание пользовательского типа?