Я думаю, что ваша путаница заключается в этой строке:
void * storage = malloc( 4 );
Похоже, вы пытаетесь выделить место для 4-байтового указателя, но это не то, что вам нужно делать. Давайте разберем строку в два этапа:
void * storage; // This allocates 4 bytes for a variable of type "pointer to void"
storage = malloc( 4 ); // This allocates 4 _more_ bytes and sets "storage" to their address.
Я предполагаю, что «магический» код копирует данные из переменной типа Typename
в память, выделенную для storage
, с таким эффектом:
memcpy(storage, data_from_a_Typename_variable, sizeof(Typename));
Таким образом, если sizeof(Typename)
больше, чем 4 байта, которые были выделены для storage
, вы увидите ошибку повреждения кучи.
Как показывают другие ответы, вам нужно выделить достаточно места для переменной Typename
, например:
void * storage = malloc(sizeof(Typename));
Но, как предложила Лиз Альбин , вы уже выделили пространство для Typename
в result
, поэтому проще передать &result
или (void *) &result
в магическую функцию.