2017-11-02 1 views
0

Ein "Deeltal" verfolgt, wie viele Teiler eine ganze Zahl hat (zählen) und hält sie in einem Array (Teiler).Freigabe des Zeigerspeichers sowie des Zeigers selbst

Beispiele:

Wert = 8 -> count = 3 und Teilern = {1,2,4}

Wert = 10, count = 3, Teilern = {1,2,5}

Hoffnung ist alles klar, werfen Sie einen Blick auf den folgenden Code:

typedef struct{ 
    int value; 
    int count; 
    int* dividers; 
} Deeltal; 


void free_dividers(Deeltal *g){ /*Deletes the int* dividers of a given Deeltal*/ 
    free (g - > dividers); 
} 

/* the following two functions have the same purpose: deleting the content of a 
given amount of "Deeltal" AND deleting the pointer to it aswell*/ 

void free_amountOfdeeltal(Deeltal *d, int amount){ 
    int i; 
    for (i = 0; i < amount; i++){ 
     free_dividers(&d[i]); 
    } 
    free(d); 
} 

void free_amountOfdeeltalVersion2(Deeltal **g, int amount){ 
    int i; 
    for(i = 0; i < amount; i++){ 
     free_dividers(&(*g)[i]); 
    } 
    free(*g); 
} 

Wenn mein Haupt so etwas wie dieses

sah
int main(void){ 
    /*EDIT 3/11/2017: forgot to allocate memory for *d and initializing g. 
    Thanks for pointing this out*/ 

    Deeltal g = 0; 
    g.value = 6; g.count = 3; g.dividers = {1,2,3}; 

    Deeltal *d = malloc(sizeof(Deeltal)); 
    d->value = 6; d->count = 3; d->dividers = {1,2,3}; 

    free_amountOfdeeltal(&g); 
    free_amountOfdeeltalVersion2(&d); 
} 

Was ist der Unterschied zwischen free_amountOfdeeltal und free_amountOfdeeltalVersion2?

Beide sollten das gleiche tun: Freigabe des Speichers von Deeltal und auch Löschen des Zeigers, der auf diesen Speicher zeigt.

Auf einer Nebennote: Wie löschen Sie den Speicher sowie den Zeiger?

+4

Beide sind falsch, ich sehe keinen Speicher zugewiesen werden, also warum Sie es freigeben? – tkausl

+0

und selbst wenn Sie Speicher zugewiesen haben, sind die letzten beiden falsch. Alles, was Sie brauchen, ist Ihre erste nette einfache – pm100

+0

Ungeachtet des Aufrufs der Funktionen mit ungültigen Daten, wie von @ tkausl hingewiesen, erlaubt die zweite Version Ihnen, "* g" auf "NULL" zuzuweisen, bevor Sie zurückkehren. Was manchmal nützlich sein kann. – MFisherKDX

Antwort

1

Nicht zu erwähnen Aufruf dieser Funktion mit ungültigen Daten wie von anderen hingewiesen .. Ich werde versuchen, die Frage zu beantworten, die ich denke, Sie fragen.

Auf einer Nebenbemerkung: Wie löschen Sie den Speicher sowie den Zeiger?

Sie können den Zeiger in diesem Kontext nicht wirklich löschen, da ein Zeiger einfach eine Variable ist, der eine Adresse zugewiesen ist. Sie löschen Speicher, der zugewiesen wurde, indem Sie free einen Zeiger auf den Speicher übergeben. Beachten Sie, dass free den Wert des Zeigers überhaupt nicht ändert. (Dies kann nicht geschehen, da der Zeiger nach Wert übergeben wird.) Nach dem Aufruf an free zeigt der Zeiger immer noch auf die gleiche Speicheradresse.

Wenn das, was Sie meinen, ist: „Wie kann ich einen sinnvollen Wert auf den Zeiger zuweisen zu erkennen, dass seine Speicher wurde bereits gelöscht“, dann können Sie die zweite Form Ihrer Funktion:

void free_amountOfdeeltalVersion2(Deeltal **g, int amount); 

und Setzen Sie *g auf NULL, bevor Sie zurückkehren. Sie können diese Information dann verwenden, wenn der Zeiger NULL ist, um zu identifizieren, dass der Speicher bereits gelöscht wurde.

0

Sie haben keinen Speicher für d zugewiesen, so dass Ihr Zeiger auf keine Struktur zeigt. Daher können Sie nicht auf seine Eigenschaften zugreifen oder seinen Speicher freigeben, da Sie ihn nicht reserviert haben. Es gibt keine Möglichkeit, dass dieser Code dem Kompilieren nahe kommt.

Zunächst einmal sollten Sie Speicher für eine „Deeltal“ Struktur wie folgt sein Zuweisung:

Deeltal *d = malloc(sizeof(Deeltal)); 

Ich empfehle Ihnen, gehen Sie zurück und wieder lernen, wie Zeiger funktionieren, wie Sie einige wirklich seltsame Dinge dort tun.

Verwandte Themen