2016-07-29 13 views
-3

ich eine Struktur für einen 2D-LinkedList habe ich mache:C - Malloc Absturz/verderbter Heap mit Pointers

struct Node 
{ 
    void *data; 
    struct Node *up, *left, *right, *down; 
}; 

Da ich zu Java gewohnt bin, habe ich eine Funktion, die ein Konstruktor sein vorgibt die wie folgt aussieht:

struct Node* buildNode(void *data) 
{ 
    struct Node *node = malloc(sizeof(struct Node*)); // Program crashes here. 
    node->data = data; 
    node->up = NULL; 
    node->left = NULL; 
    node->right = NULL; 
    node->down = NULL; 
    return node; 
} 

Mein Programm stürzt ab, wenn es die malloc Linie im zweiten Absatz erreicht. Wenn ich die * von der malloc(sizeof(struct Node*)) entferne, stürzt es nicht ab und funktioniert richtig.

Warum ist das? Meine buildNode Funktion gibt einfach einen Zeiger auf Node zurück und gibt die Struktur Node nicht selbst zurück. Der Fehler, den ich bekomme, hat etwas mit korrupten Heap zu tun und da ich etwas neu in C bin, verstehe ich nicht, was das alles bedeutet.

danke!

Antwort

9

dieser Zeile:

struct Node *node = malloc(sizeof(struct Node*)); 

ist ein Speicherblock pointer Größe (4 oder 8 Bytes, je nachdem, ob man in 32 oder 64-Bit-Modus sind Gebäude) Zuordnen und einen Zeiger darauf zurückkehr . Das ist nicht was du willst.

Der Versuch, auf Elemente des zurückgegebenen Objekts zuzugreifen, führt zu einem nicht definierten Verhalten wie einem Absturz, da der Speicher, den Sie treffen, außerhalb der Grenzen des zugewiesenen Speicherplatzes liegt. Sie können auch den Heap automatisch unbrauchbar machen, so dass spätere Aufrufe an malloc zu einem Absturz führen.

Während:

struct Node *node = malloc(sizeof(struct Node)); 

ist ein Speicherblock mit einer Größe von struct Node Zuteilung - das ist, was Sie wollen.

Nebenbei sollten Sie wahrscheinlich überprüfen, der zurückgegebene Zeiger ist nicht NULL vor der Verwendung, dann den Fehler elegant behandeln. Eine NULL würde zurückgegeben werden, wenn die Zuweisung fehlschlägt, z. B. wenn Sie nicht genügend Arbeitsspeicher haben.

Beachten Sie auch, dass C (im Gegensatz zu Java) keine Müll-Sprache ist. Sie müssen sicherstellen, dass Sie an jedem Punkt, den Sie zuweisen, free aufrufen, oder der Speicher wird nicht freigegeben, bis das Programm beendet wird.

+0

Nach viel lernen, ich habe viel über C gelernt und eine Sache, die mir gesagt wurde, ist Ihre letzte Aussage von "oder die Erinnerung wird nicht veröffentlicht werden, bis das Programm beendet wird." ist nicht unbedingt der Fall. Kannst du es ausarbeiten? Viele Orte, die ich sehe, sagen, dass der Platz, den Ihre Anwendung einnimmt, wenn das Programm beendet wird, freigegeben wird, egal ob Sie es vergessen haben oder nicht. – Hatefiend

+0

Das ist richtig. Der Speicher wird nicht freigegeben * bis das Programm beendet wird *, wenn das Betriebssystem den gesamten Prozess aufräumt. Ich denke, du sagst genau dasselbe wie ich. – Baldrick

+0

Oh, es tut mir leid, ich lese "Speicher wird nicht freigegeben bis" als "Speicher wird nicht freigegeben, wenn" – Hatefiend