Функция
mallo c используется для выделения определенного объема памяти во время выполнения программы. Он отправляет запрос в ОС и, если это возможно, ОС зарезервирует запрошенный объем памяти из кучи. (функция возвращает адрес выделенного пространства)
+-------+------------------+------+----------------------+
| stack | -> free space <- | heap | data & code segments |
+-------+------------------+------+----------------------+
free работает по-другому, принимает адрес (ссылка) который указывает на некоторый блок памяти и освобождает его.
Если вы хотите, чтобы он был освобожден в main, вы бы сделали это следующим образом:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
free(ctx);
}
, но так как вы конвертируете его в удвоенный указатель (указатель на указатель) вам нужно разыменовать его обратно на адрес, который вы выделили:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
ctx **some_struct_type = &ctx;
free(*some_struct_type);
}