2016-05-02 4 views
1

Ich habe ein wenig Schwierigkeiten, eine Beispielfunktion zu verstehen, die mein Professor als Beispiel für verknüpfte Listen angegeben hat. Es scheint, dass der zugewiesene Speicher nicht wirklich im Bereich von main liegt. Aber es scheint zu funktionieren. Hier sind die Funktionen Beispiel:Speicherbereich mit verketteten Listenfunktionen

#define NEW(x) (x*)malloc(sizeof(x)) 

NODE *make_node (void *data) { 
    NODE *temp; 

    temp = NEW(NODE); 
    if (temp != NULL) { 
     temp->data = data; 
     temp->next = NULL; 
    } 

    return temp; 
} 

int insert_at_tail(ROOT *r, DATA *d) { 
    NODE *temp; 

    temp = make_node(d); 

    if (temp == NULL) // fail, cannot create new NODE 
     return -1; 

    if (r == NULL) { 
     r = make_root(); 
     if (r == NULL) // fail, cannot create ROOT 
      return -1; 
    } 

    (r->num)++; 

    if (r->num == 1) {    // if previously the list is empty 
     r->head = r->tail = temp; 
    } 
    else { 
     r->tail->next = temp; 
     r->tail = temp; 
    } 

    return 0; 
} 

Es scheint mir, dass die Funktion insert_at_tail die make_node Funktion aufruft, die dann einen Speicherplatz in der Funktion insert_at_tail zurückgibt. Aber dieser Speicherort ist in dem Bereich dieser Funktion? Der Speicher wird dann verknüpften Listendaten zugewiesen. Wie kommt es, dass in der Hauptfunktion die Daten der verknüpften Liste immer noch auf diesen Speicher zugreifen können? Ich dachte, Malloc wäre nicht global. Danke fürs Lesen! Hoffentlich kann jemand meiner Verwirrung helfen.

+0

BTW 'r = make_root();' Vielleicht funktioniert das nicht. – BLUEPIXY

Antwort

3

malloc ist, wie Sie den Heapspeicher zuweisen; Der zugewiesene Speicher bleibt solange stehen, bis der Zeiger explizit free -ed ist. Jeder mit Zugriff auf diesen Zeiger kann ihn verwenden, bis der Zeiger an free übergeben wird.

malloc ist nicht "global" in dem Sinne, dass es Zeiger auf Speicher zurückgeben kann, die nicht im globalen Speicherbereich zugewiesen ist, aber das bedeutet nicht, dass der Speicher automatisch zugeordnet wird, wenn der Bereich, in dem malloc wurde als Ausgänge bezeichnet.