Pointer ist in der Funktion beschrieben, außerhalb wieder NULL

Gast #7239429
Hallo,
ich versuche mich gerade in der Listenerstellung in C.
Da habe ich momentan große Probleme einen Pointer aus einer Funktion 
zurückzugeben.
1
typedef struct listNode node;
2

3
int main(void)
4
{
5
    static node* list = NULL;
6
    initList(list, 2);
7
    printList(list);
8
}
9

10
static void initList(node* list, uint8_t data_u8)
11
{
12
    node* newList = malloc(sizeof(node));
13
    if(NULL != newList)
14
    {
15
        newList->data_u8 = data_u8;
16
        newList->next = NULL;
17
        list = newList;
18
        printf("address: %p\tvalue: %i\r\n", newList, newList->data_u8);
19
        printf("address: %p\tvalue: %i\r\n", list, list->data_u8);
20
    }
21
}
22

23
static void printList(node* list)
24
{
25
    if(NULL != list)
26
    {
27
        do{
28
            printf("address: %p\tvalue: %i\r\n", list, list->data_u8);
29
        }while(list->next != NULL);
30
        printf("\r\n\r\n");
31
    }
32
    printf("list is NULL\r\n");
33
}

in der funktion initList bekomme gibt mir das zweite printf die selben 
werte wie vom ersten printf aus.
Damit sollte der pointer list auf newList liegen.
Wenn ich dann aber printList aufrufe, bekomme ich das printf"list is 
NULL" heraus.
Wieso ist die variable auf einmal verschwunden (bzw. war gar nicht von 
initList geschrieben worden?
#7239461
Du verwendest eine Parameterübergabe "per-value" (Input-Parameter). 
Damit kann das Argument des Aufrufers vom Aufgerufenen nicht verändert 
werden.

Entweder Du änderst das bei initList() zu einem Output-Parameter oder Du 
gibt den Zeigerwert zurück.
#7239490
Jonas schrieb:
> Wilhelm M. schrieb:
>> Entweder Du änderst das bei initList() zu einem Output-Parameter
>
> Wie mache ich das denn genau? Bzw. was meinst du denn genau? Ich dachte
> durch den Pointer wäre das schon ein input/output parmaeter

Nein, der Pointer selbst wir per-value übergeben.

Du brauchst das:
1
void initList(node** list, uint8_t data_u8);
oder
1
node* initList(uint8_t data_u8);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.