2016-07-30 2 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, динамическое распределение «Карта» здесь не нужно. И где-то в «Карта» должна быть величина массива указателей «Node», или вы собираетесь найти расширение, сокращение и повторное использование, когда факторы нагрузки вознесены невозможными. Наконец, [не бросайте 'malloc()' и друзей в C-программы] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – WhozCraig

+0

Спасибо! WhozCraig –

ответ

1

Вы выделить место для SIZE указателей на Node, но не инициализировать их в любом случае, поэтому, когда вы получаете доступ M->Darray[i] в M->Darray[i]->data вы получите ошибку сегментации, поскольку значение 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

Спасибо! Маркус Лайр –

Смежные вопросы