[C] Pointer nach Funktionsaufruf nicht NULL

trench140

Mitglied
Mahlzeit allerseits,

mal wieder hab ich ein kleines Problemchen und ich komme nicht weiter.

Es geht um Folgendes:

In meiner main-Funktion setze ich zunächst einen Pointer auf NULL:

Code:
typedef struct{
    ...
    blogEntry_t *blogEntry;
    ...
} mainWin;
...
int main(int argc, char *argv[])
{
    ...
    mainWindow->blogEntry = NULL;
    ...
}

Anschließend schwurbelt das Programm fröhlich vor sich hin (an das Ganze ist noch GTK angeflanscht), und irgendwann drückt man dann mal ein Knöpfchen und blogEntry wird mit Daten gefüllt. Das ist auch schön und gut, denn ich prüfe in der entsprechenden Funktion, ob blogEntry NULL ist bevor ich es gegebenenfalls free'e:

Code:
freeBlogEntry(mainWindow->blogEntry);

Code:
void freeBlogEntry(blogEntry_t *blogEntry)
{
	if(blogEntry != NULL)
	{
		if(blogEntry->date != NULL)
		{
			printf("Free date...\n");
			free(blogEntry->date);
			blogEntry->date = NULL;
		}
		if(blogEntry->audioURL != NULL)
		{
			printf("Free audioURL...\n");
			free(blogEntry->audioURL);
			blogEntry->audioURL = NULL;
		}
		if(blogEntry->imageURL != NULL)
		{
			printf("Free imageURL...\n");
			free(blogEntry->imageURL);
			blogEntry->imageURL = NULL;
		}
		
		free(blogEntry);
		blogEntry = NULL;
	}
}

Das Problem des Ganzen:

Es funktioniert genau ein einziges Mal. Beim ersten Klick werden Daten geladen, weil das Ganze in der main() ja auf NULL gesetzt wurde. Beim zweiten Klick wird zwar freeBlogEntry() aufgerufen, aber am Ende scheinbar blogEntry nicht auf NULL gesetzt (oder aber es wirkt sich nicht, wie gedacht, auf mainWindow->blogEntry aus). Und beim dritten Klick knallt es dann, weil das Ganze nicht NULL ist, aber auch keine Daten mehr enthält und somit "free" daneben geht.

Code:
blogEntry = NULL;

resultiert also scheinbar nicht, wie gewünscht in

Code:
mainWindow->blogEntry = NULL;

obwohl ich doch auf dem Pointer arbeite (?).

Ich verstehe nun nur nicht ganz, warum mir der Wert des Pointers nicht auf NULL gesetzt wird, denn da ich ja direkt auf dem Pointer arbeite sollte sich die Änderung durch nach dem Durchlaufen der Funktion unmittelbar auf "mainWindow->blogEntry" auswirken, oder seh ich hier irgendeinen Fehler nicht?

Danke + Gruß,
Trench
 
Code:
blogEntry = NULL;

resultiert also scheinbar nicht, wie gewünscht in

Code:
mainWindow->blogEntry = NULL;

obwohl ich doch auf dem Pointer arbeite (?).
Du setzt in deiner Funktion lediglich eine lokale Variable auf NULL. Um den Wert einer externen Variable in einer Funktion verändern zu können, brauchst du die Adresse selbiger. Du musst also einen Zeiger auf den Zeiger übergeben:
C:
void freeBlogEntry(blogEntry_t **blogEntry)
{
	if(blogEntry != NULL && *blogEntry  != NULL)
	{
		/* … */
		free(*blogEntry);
		*blogEntry = NULL;
	}
}

Grüße, Matthias
 
Oh verdammt, da wäre ich jetzt nie drauf gekommen. Ist das erste Mal, dass ich überhaupt mit Pointern arbeite, bisher habe ich mich immer erfolgreich darum gedrückt.

Vielen lieben Dank für die Hilfe, das hat mir jetzt stundenlanges Probieren ersparrt.

Gruß,
Daniel

Edit: Perfekt, es klappt, nochmal tausend Dank :)
 
Zuletzt bearbeitet:
Zurück