2016-07-30 42 views
0

Ich versuche eine Hash-Map in C zu erstellen. Unten ist der Code. Wenn ich versuche den Elementen von Darray einen Wert zuzuordnen (von denen jeder ein Zeiger auf einen Knoten ist) bekomme ich einen Segmentierungsfehler (d. H. In Zeile 23 und 24). Kann jemand helfen, aufzuzeigen, wo ich falsch liege?Segmentierungsfehler beim Zuweisen von Wert zu einem dynamischen Array von Knoten innerhalb einer Struktur

#include <stdio.h> 
#include <stdlib.h> 

typedef struct Node { 
    int data; 
    struct Node* next; 
}Node; 

typedef struct Map{ 
    struct Node** Darray; 
} Map; 

#define SIZE 10 
int main() 
{ 
    int i=0; 
    Map* M = malloc(sizeof(Map)); 
    M->Darray = (struct Node**)malloc(sizeof(Node*)*SIZE); 
    for (i =0;i < SIZE;i++){ 
     M->Darray[i]->data =0; 
     M->Darray[i]->next =NULL; 
    } 
} 
+1

Fyi, dynamische Zuordnung von 'Map' ist hier nicht notwendig. Und irgendwo in 'Map' sollte die Größe des' Node'-Pointer-Arrays liegen, oder Sie werden Expansion, Reduktion und Umhashing finden, wenn die Lastfaktoren nicht aufgefahren sind. Schließlich, [werfen Sie nicht 'malloc()' und Freunde in C-Programme] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – WhozCraig

+0

Danke! WhozCraig –

Antwort

1

Sie ordnen Platz für SIZE Zeiger auf Node, aber nicht initialisieren diese in irgendeiner Weise, so dass, wenn Sie M->Darray[i] Zugriff in M->Darray[i]->data Sie Segmentierungsfehler, weil der Wert M->Darray[i] nicht festgelegt wurde.

Sie brauchen Platz, bevor Sie es für jeden Knoten zuweisen:

for (i = 0; i < SIZE; i++) { 
    M->Darray[i] = malloc(sizeof(Node)); 
    M->Darray[i]->data = 0; 
    M->Darray[i]->next = NULL; 
} 

Je nach Bedarf, können Sie auch Darray ändern könnte ein Array von Knoten anstelle von Knoten Zeiger zu sein, so dass Sie Speicherplatz zuweisen können Alle Knoten gleichzeitig:

struct Node* Darray; 
... 
M->Darray = malloc(sizeof(Node) * SIZE); 
for (i = 0; i < SIZE; i++) { 
    M->Darray[i].data = 0; 
    M->Darray[i].next = NULL; 
} 
+0

Danke! Markus Laire –