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
sahint 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?
Beide sind falsch, ich sehe keinen Speicher zugewiesen werden, also warum Sie es freigeben? – tkausl
und selbst wenn Sie Speicher zugewiesen haben, sind die letzten beiden falsch. Alles, was Sie brauchen, ist Ihre erste nette einfache – pm100
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