[GELÖST]Adresse eines Pointers in Funktion ändern (Doppelpointer)
-
Hallo zusammen,
ich möchte in der main-Funktion einen Zeiger initialisieren dessen Adresse dann in einer der Unterfunktionen geändert wird und die Adresse bis zur main-Funktion zurück erhalten bleibt.
Nach unzähligen Spielereien hier ein semantisch korrekter Ansatz:#include <stdio.h> #include <stdlib.h> struct test { int *array; struct test *next; }; void foo2(struct test **list) { struct test *list_p; struct test *list_pcat; /* Verbund anlegen */ list_p = (struct test*) malloc(sizeof(struct test)); list_p->array = (int*) malloc(sizeof(int)*5); // nur zum Beispiel /* falls noch kein Element in Liste */ if(*list==NULL) *list = list_p; else { /* list_p_cat ist Durchlaufzeiger zum Verketten von *list und list_p */ for(list_pcat=*list; list_pcat->next!=NULL; list_pcat=list_pcat->next) { /* leer */ } /* Verketten von *list und list_p mithilfe von list_pcat */ list_pcat->next = list_p; } list_p->next = NULL; return; } void foo(struct test **list) { foo2(list); /* Pointer 'list' auf Listenanfang soll hier weitergereicht werden */ return; } int main(void) { struct test *list = NULL; foo(&list); /* Der Pointer auf den Listenanfang soll hier verwendet werden */ return 0; }
mfg light645
-
Das a aus der Funktion existiert nicht mehr, wenn die Funktion verlassen wird. Informiere dich über die Grundlagen der Gültigkeitsbereiche von Variablen und wie man diese Steuern kann, dann wird dir dies klar werden.
Stichworte dafür: Gültigkeitsbereich (engl. Scope), das Schlüsselwort
static
und eventuell auchmalloc
.edit: Prinzipiell war dein erster Ansatz schon richtig, nur das a war eben nicht mehr da.
-
#include <stdio.h> void foo(int **pointer){ static int i = 100; *pointer = &i; } int main(){ int a = 44; int *ptr = &a; printf("%p\n", ptr); foo(&ptr); printf("%p\n", ptr); }
-
Danke für die Antworten.
'Brett vorm Kopf'! Richtig schlechtes Beispiel ausgewählt
Dann eben doch kompliziert.
Ich habe das Problem nochmal überarbeitet. Auf die Lösung bin ich aber noch nicht gekommenPS: Super! Jetzt weiß ich wie man Adressen ausdrucken kann. %p haben wir im Studium bisher noch nicht gelernt, oder ich war ausnahmsweise unaufmerksam
-
Letztendlich bin ich doch selber auf die richtige Lösung gekommen.
Ich habe den Code nochmal ein wenig überarbeitet. Er ist nun syntaktisch korrekt und entspricht 100% meiner Problemstellung.Erklärung: ein Zeiger(list) auf das erste Listenelement wird in main initialisiert. Dieser wird an foo(&list) als Call By Reference übergeben. foo übergibt die Adresse des Zeigers(Zeiger auf Zeiger) auf den Listenanfang an foo2(list) als Call By Value, da die Adresse des Zeigers auf den Zeiger list ja nicht geändert werden soll/muss.
In foo2 wird mithilfe von list_p ein Verbund erzeugt, der je nachdem ob bereits ein Verbund an list hängt, als erstes drangehängt wird oder mithilfe des Durchlaufzeigers als letztes Element verkettet wird.
Zu guter letzt natürlich nicht vergessen, den allerletzten Zeiger list_p->next auf NULL zu setzen und in den Wald zeigen zu lassen.
Somit ist in der main-Funktion die Adresse des Zeigers list von NULL auf die Adresse des ersten Listenelements geändert worden.
So einfach sind einfach verkettete ListenTrotzdem danke für die Antworten.
mfg
light645