когда освободить указатель в C и как узнать, освобожден ли он

Я новичок в C, пытаясь выяснить о распределении памяти в C, что я вроде запутался

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int a;
} struct1_t;

int main()
{
    funct1(); //init pointer
    return 1;
}


int funct2(struct1_t *ptr2struct)
{
    printf("print a is %d\n",ptr2struct->a);
    //free(ptr2struct);
    printf("value of ptr in funct2 is %p\n", ptr2struct);
    return 1; //success
}


int funct1(){

    struct1_t *ptr2struct = NULL;
    ptr2struct = malloc(sizeof(*ptr2struct));
    ptr2struct->a = 5;
    printf("value of ptr before used is %p", ptr2struct);
    if (funct2(ptr2struct) == 0) {
        goto error;
    }
    free(ptr2struct);

    printf("value of ptr in funct1 after freed is is %p\n", ptr2struct);
    return 1;

error:
    if(ptr2struct) free(ptr2struct);
    return 0;
}

У меня есть функция 1, которая вызывает функцию 2, и после использования выделенного указателя в funct1 я пытаюсь освободить указатель. И я создаю случай, когда, если возвращаемое значение в funct2 не равно 1, попробуйте еще раз, чтобы освободить указатель.

Мой вопрос ниже

какая практика лучше, если мне нужно освободить память в funct2 (после того, как я ее передам) или в funct1 (после того, как я закончу получать возвращаемое значение funct1) Второе - это правильно ли делать ошибку goto и error:

if(ptr2struct) free(ptr2struct); 

Мой третий вопрос: как проверить, освобождено ли выделенное значение или нет? потому что после получения возвращаемого значения я освобождаю указатель, но если я его печатаю, он показывает то же место, что и выделенное (поэтому не нулевой указатель).

Ответы на вопрос(5)

Ваш ответ на вопрос