Что касается ответа на ваш вопрос: «Как освободить память для структурирования, когда на нее больше нет указателя?».
Ты не можешь. Ваш код утечки памяти.
Однако в вашем коде много ошибок, которые не имеют смысла
magicNums tempStruct, *struct_ptr=&tempStruct;
struct_ptr=(magicNums*)malloc(sizeof(magicNums));
Первые две строки сначала устанавливают struct_ptr = & tempStruct; , а затем заменяет этот указатель на возврат из malloc. 2 строки выполняют точно так же, как:
magicNums tempStruct;
magicNums *struct_ptr;
struct_ptr=(magicNums*)malloc(sizeof(magicNums));
Это может прояснить, что происходит.
return tempStruct;
Возвращая tempStruct здесь, вы потеряли указатель на struct_ptr, поэтому вы не можете его освободить, и вы теряете память.
Вы не потеряли указатель на tempStruct.numbers. Вы можете освободить это в своей главной:
magicNums myNumbers;
myNumbers=makeStruct(10);
free(myNumbers.numbers);
magicNums не является указателем, вы не можете и не должны освобождать это. Вы возвращаете структуру по значению, так что все в порядке - там нет динамической памяти.