Я новичок в 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 и ошибку:
if(ptr2struct) free(ptr2struct);
Мой третий вопрос: как проверить, освобождено ли выделенное значение или нет? потому что после получения возвращаемого значения я освобождаю указатель, но если я его распечатаю, он показывает то же место с выделенным (так что это не нулевой указатель).