Ich bin verwirrt mit dem Einsatz von free()
in Bezug auf den Datenstrukturen in C.von malloc und free Verhalten verwirrt
Wenn ich die folgenden Datenstruktur:
struct Person {
char *name;
int age;
float weight;
float height;
};
ich für die Speicher am Zuteilen Struktur über malloc()
ebenfalls: struct Person *me = malloc(sizeof(struct Person));
Nachdem ich meine Struktur mit der Verwendung fertig bin (rechts vor dem beenden des Programms), ich gehe zugewiesen um den Speicher zu befreien, wie folgt aus:
free(person_pointer->name);
free(person_pointer);
die Speicher Befreit, dass die name
Zeiger auf mein Wissen notwendig sind, denn wenn ich nur frei person_pointer
ich nur den Speicher frei, die die Datenstruktur und ihre Mitgliederaber nicht der Speicher zum Speichern zugewiesen wurden Darauf verweisen Zeiger - Mitglieder der Struktur.
Allerdings scheint mit meiner Implementierung valgrind darauf hinzuweisen, dass die erste free()
ungültig ist.
Also meine Frage läuft auf: Wenn ich den Speicher freigeben, den eine Struktur über einen Zeiger einnimmt, sollte ich präventiv den Speicher freigeben, auf den Mitgliedszeiger zeigen oder nicht?
EDIT: Das ist mein ganzer Code:
#include <stdio.h>
#include <stdlib.h>
struct Person {
char *name;
int age;
float weight;
float height;
};
int main(int argc, char **argv)
{
struct Person *me = malloc(sizeof(struct Person));
me->name = "Fotis";
me->age = 20;
me->height = 1.75;
me->weight = 75;
printf("My name is %s and I am %d years old.\n", me->name, me->age);
printf("I am %f meters tall and I weight %f kgs\n", me->height, me->weight);
free(me->name);
free(me);
return 0;
}
@Mat mache ich malloc(). Ich werde die Frage bearbeiten, um dies zu klären. – NlightNFotis
@Mat Nur die Frage mit meiner Zuweisungsmethode aktualisiert. Wenn du mehr Informationen brauchst, könnte ich meinen ganzen Code posten, es ist ein ziemlich kleines Programm, aber von jetzt an werde ich es aus Gründen der Klarheit unterlassen. – NlightNFotis
+1 für einen vollständigen Testfall mit Valgrind usw. –