2016-12-22 4 views
2

Zum Beispiel habe ich diese Struktur:Wird ein Strukturzeiger auch den innerhalb der Struktur in C zugewiesenen Speicher freigeben?

typedef struct{ 
    char *var = (char*)malloc(20*sizeof(char)); 
} EXAMPLE; 

EXAMPLE *point = (EXAMPLE*)malloc(sizeof(EXAMPLE)); 

Meine erste Frage ist, wird das nur innerhalb der Struktur zugewiesenen Speicher zugewiesen werden, wenn ich Speicher für den Zeiger EXAMPLE zuweisen?

Meine zweite Frage, wenn ich free(point) verwende, wird der Speicher freigegeben für var auch befreit werden?

+1

Dies ist kein gültiger C-Code. – AnT

+0

Ich weiß nicht warum, aber wenn ich die Frage einreiche, entfernt es die Sternchen –

+0

'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. –

Antwort

2

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.

3

Ich bin da die Frage, die nicht-Kompilierung Code zu ignorieren, ist ziemlich klar, ohne es

Nr free() ;-) kennt nicht die Struktur, was es zeigt auf, so dass es eine gerade befreit „-Block ". Wenn dieser Block Zeiger auf anderen Speicherbereich hat, dann sind sie durchgesickert (es sei denn, es gibt einen Zeiger auf diese Blöcke woanders).

+0

also das heißt ich muss auch den var pointer richtig frei machen? –

+1

Ja. Wenn Sie es mallocen, befreien Sie es (oder breiter: wer mallocs ist, sollte dafür verantwortlich sein, es zu befreien) - wenn eine Bibliothek Speicher reserviert, sollte ein Aufruf zurück in diese Bibliothek sie freigeben. – John3136

Verwandte Themen