2016-07-30 12 views
0

Cでハッシュマップを作成しようとしています。以下はそのコードです。 Darrayの各要素(各ノードへのポインタ)に値を代入しようとすると、セグメンテーションフォルトが発生しています(つまり、23行目と24行目)。私が間違っているところを指摘するのに誰も助けてくれますか?構造内のノードの動的配列に値を代入する際のセグメンテーションエラー

#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では、ここで 'Map'の動的割り当ては不要です。また、 'Map'のどこかに' Node'ポインタ配列の大きさがなければなりません。あるいは、ロードファクタが不可能になったときに展開、縮小、再ハッシュを見つけることになります。最後に、[Cプログラムでmalloc()とfriendsをキャストしない](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – WhozCraig

+0

ありがとう! WhozCraig –

答えて

1

あなたはNodeSIZEのポインタのためのスペースを割り当てますが、どのような方法でこれらを初期化するので、あなたはM->Darray[i]->dataM->Darray[i]にアクセスしたときM->Darray[i]の値が設定されていないので、あなたがセグメンテーションフォールトを得ることはありません。

あなたはそれを使用する前に、各ノードのためのスペースを割り当てる必要があります:あなたのニーズに応じて

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

あなたのためにスペースを割り当てることができますので、あなたはまた、ノードの代わりに、ノードポインタの配列であることをDarrayを変更することができます一度にすべてのノード:

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

ありがとう!マルクス・レアール –

関連する問題