Ich bin neu in C und versuche herauszufinden, über Speicherzuweisung in C, dass ich irgendwie verwirrt
#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;
}
Ich habe eine Funktion 1, die Funktion 2 aufruft, und nachdem ich den zugewiesenen Zeiger in Funktion 1 verwendet habe, versuche ich, den Zeiger freizugeben. Und ich erstelle einen Fall, in dem, wenn der Rückgabewert in funct2 nicht 1 ist, dann versuche ich erneut, den Zeiger zu befreien.
Meine Frage lautet wie folgt
welche Praxis ist besser, wenn ich den Speicher in funct2 freigeben sollte (nachdem ich ihn übergeben habe) oder in funct1 (nachdem ich den Rückgabewert von funct1 erhalten habe) Die zweite Sache ist, ob es richtig ist, einen goto-Fehler zu machen, und Fehler:
if(ptr2struct) free(ptr2struct);
Meine dritte Frage ist, wie kann ich überprüfen, ob der zugewiesene Wert bereits freigegeben ist oder nicht? denn nachdem ich den Rückgabewert erhalten habe, gebe ich den Zeiger frei, aber wenn ich ihn ausdrucke, zeigt er die gleiche Position mit dem zugewiesenen (also nicht ein Nullzeiger).