c - 为结构内部的动态节点数组赋值时出现段错误

标签 c hashmap segmentation-fault malloc

我正在尝试用 C 创建 HashMap 。下面是代码。当我尝试 为 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;
    }
}

最佳答案

您为 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;
}

关于c - 为结构内部的动态节点数组赋值时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677115/

相关文章:

c - C 中求最大升序子数组的元素之和?

在 Windows XP 中编译 C

c - 将整数插入通过 C 中的指针访问的数组中

java - 将 HashMap 键值 (String) 转换为 Vector <String>?

具有嵌套字符串或 ArrayList 的 Java HashMap

c - c中for循环中的段错误

c++ - 调用recv()会导致段错误

c - setjmp longjmp 在 Netbeans cygwin Windows XP 下崩溃

c - 跳台 - 组件 8086

java.util.ConcurrentModificationException,但我正在迭代副本,而不是正在修改的集合