Forum: PC-Programmierung Pointer ist in der Funktion beschrieben, außerhalb wieder NULL


von Jonas (Gast)


Lesenswert?

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?

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

: Bearbeitet durch User
von Jonas (Gast)


Lesenswert?

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

von Wilhelm M. (wimalopaan)


Lesenswert?

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);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.