Mit dieser Struktur:
typedef struct{
char *var;
} EXAMPLE;
Denken Sie daran, dass, wenn Sie Platz für die Struktur zuweisen, sind Sie Raum nur für den char *
Zeiger zuordnet. Dieser Zeiger zeigt nur woanders auf den Speicher. Wenn Sie die Struktur free()
haben, befreien Sie nur den Zeiger char *
, nicht den tatsächlichen Speicher, auf den er zeigt.
Als solcher, wenn Sie diese Struktur machen und dann malloc()
Raum für die Zeichenfolge wollen Sie var
zu verweisen, müssen Sie die Zeichenfolge sowie free()
ing die Struktur free()
.
Einige Code demonstriert, wie dies funktionieren könnte:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct {
char *var;
} EXAMPLE;
int main(int argc, char *argv[]) {
// malloc() space for the EXAMPLE struct.
EXAMPLE *point = malloc(sizeof(EXAMPLE));
// malloc() space for the string that var points to.
point->var = malloc(20 * sizeof(char));
// Copy "Hello!" into this memory (care with strcpy).
strcpy(point->var, "Hello!");
// Print it, it works!
printf("point->var is: %s\n", point->var);
// Free stuff.
free(point->var);
free(point);
return 0;
}
Beachten Sie auch, dass wir das Ergebnis von malloc()
, in C nicht werfen Sie nicht gemeint. Beachten Sie auch, dass wir free()
Punkt-> var zuerst vor Punkt. Das ist wichtig, denn wenn wir free()
zuerst zeigen, verlieren wir den Zeiger auf point-> var, und wir haben ein Speicherleck.
Dies ist kein gültiger C-Code. – AnT
Ich weiß nicht warum, aber wenn ich die Frage einreiche, entfernt es die Sternchen –
'free' befreit den Speicher, der als das Ergebnis des Aufrufs zugewiesen wurde, der den Wert seines Arguments erzeugte. Das ist es. Nicht mehr und nicht weniger. –