quand libérer le pointeur en C et comment savoir s'il est libéré

Je suis nouveau en C, en essayant de comprendre au sujet de l'allocation de la mémoire en C que j'ai un peu confus

#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;
}

J'ai funct 1 qui appelle funct 2, et après l'utilisation de l'allocation d'un pointeur dans funct1, j'ai essayer de libérer le pointeur. Et je créer un cas où, si la valeur de retour dans funct2 n'est pas 1, puis essayez à nouveau de libérer le pointeur à l'.

Ma question est ci-dessous

dont la pratique est mieux, si je dois libérer de la mémoire, dans funct2 (après je le passe) ou dans funct1 (après que j'ai fini l'obtention de la valeur de retour de funct1)
La deuxième chose, c'est de savoir si c'est correct de faire un goto erreur, et l'erreur:

if(ptr2struct) free(ptr2struct); 

Ma troisième question est , comment puis-je vérifier si la valeur allouée est déjà libéré ou pas? parce que, après l'obtention de la valeur de retour, je libère le pointeur, mais si j'ai l'impression, elle montre le même emplacement et avec l'allocation d'un (donc pas un pointeur null).

source d'informationauteur xambo