2017-01-03 11 views
-2

Ich versuche, eine doppelt verknüpfte Liste in C zu implementieren, und ich muss eine Initialisierungsfunktion verwenden, während ein Größenfeld beibehalten wird. Mein Code ist wie folgt:Initialisierung einer Struktur außerhalb von main() mit malloc (C89)

typedef struct element{ 
    struct element* next; 
    struct element* prev; 
    int value; 
}element_t; 

typedef struct linkedlist{ 
    element_t* head; 
    element_t* tail; 
    int size; 
}linkedlist; 

void init(linkedlist* list){ 
    list = malloc(sizeof(linkedlist)); 
    list->size = 0; 
} 

int main(int argc, char** argv){ 
    linkedlist* list; 
    init(list); 
    return 0; 

Wenn ich versuche, Listen- zugreifen> Größe in der init-Funktion, bekomme ich den richtigen Wert, aber wenn ich versuche, aus dem Haupt Listen-> Größe für den Zugriff auf das Programm zurückkehrt ein seltsamer, großer negativer Wert (wahrscheinlich eine Adresse in hex).

Würde gerne wissen, was ich falsch mache. stdlib ist enthalten.

+0

Ich bekomme nicht die Down-Stimmen. Es ist eine klare Frage mit dem bereitgestellten Code. – hetepeperfan

Antwort

5

Sie ändern nur eine lokale Kopie von list, die main wird nie sehen. Sie wollen wahrscheinlich so etwas wie dies zu tun:

linkedlist* init(void) { // <<< 
    linkedlist* list = malloc(sizeof(linkedlist)); // <<< 
    list->size = 0; 
    return list; // <<< 
} 

int main(int argc, char** argv){ 
    linkedlist* list = init(); // <<< 
    return 0; 
} 

Wenn Sie die ursprüngliche Funktion Unterschrift zu halten haben, dann müssen Sie nicht list innerhalb init ändern. Sie könnten stattdessen Folgendes tun:

void init(linkedlist* /* const */ list){ 
    list->size = 0; 
} 

int main(int argc, char** argv){ 
    linkedlist list; //<<< 
    init(&list); //<<< 
    return 0; 
+0

Das funktioniert, aber wie soll ich die Funktionssignatur implementieren: void init (verknüpfte Liste * Liste) , auf die ich beschränkt bin? – Triumphan

+0

Sie können nicht - entweder verwenden Sie die obige Methode, oder Sie verwenden @ Dbush-Methode, oder Sie tun die "malloc" (oder gleichwertig) außerhalb 'init' (zB in' main'), so dass die 'liste' Zeiger wird nicht geändert. –

+0

Sehr gut, ich werde weitermachen - danke – Triumphan

2

In C werden alle Parameter als Wert übergeben. Also die list Variable in init ist eine Kopie des Wertes list in main, und es ist diese Kopie, die geändert wird. Die Änderung wird also nicht außerhalb der Funktion gesehen.

Sie benötigen die Adresse von list in init, passieren und die Funktion ändern, um einen Zeiger auf Zeiger zu akzeptieren.

void init(linkedlist **list){ 
    *list = malloc(sizeof(linkedlist)); 
    (*list)->size = 0; 
} 

int main(int argc, char** argv){ 
    linkedlist *list; 
    init(&list); 
    return 0; 
} 
Verwandte Themen