为什么我的用于将元素插入到哈希树中的 C 代码在 Main() 中有效,但在我通过函数调用它时却无效?

Why does my C code for inserting an element into a hash tree work in Main() but not when I call it via function?

我相当确定这与指针和使用副本的函数有关,但我不确定如何...因为我已将指针作为 create() 的参数插入;

#include <stdio.h>
#include <cs50.h> 
#include <string.h>

typedef struct list {
    string word;
    struct list *next;
}
linkedList; 

struct list* create (string newWord) {
    linkedList *new = malloc(sizeof(newWord));
    new->word = newWord;
    new->next = NULL;
    return new;
}

struct list* insert (struct list *theList, string newValue) {
    linkedList *anotherOne = create(newValue);
    anotherOne->next = theList;
    return anotherOne;
}

int hash (string name) {
    return strlen(name);
}

void hashInsert (struct list *theList, string newValue) {
    theList = create(newValue);
    }

int main(void) {
   linkedList *names[24] = {NULL};
   int num = hash("heey");
 //  names[num] = create("heey"); // <- this code works when I uncomment it
   hashInsert(names[num], "heey"); // <-- this causes a segfault.. idk why
   printf("%s", names[num]->word);
}

您的 hashInsert 函数创建了指针的本地副本 (theList),您修改了该本地副本,但 main 函数中的实际指针仍设置为 NULL。调用 printf 是导致分段错误的原因。

您可以通过传递指向函数指针的指针来解决此问题

void hashInsert(string list **theList, string newValue) {
    *theList = create(newValue);
}

然后调用它

hashInsert(&names[num], "heey");

这样,你修改了main指针的值。

编辑

另外,如评论所述,您的malloc确实没有分配足够的内存,您还需要一些内存来存储下一个列表指针。

问题出在你的 hashInsert 函数上。它按值获取指针(因此您传递的原始指针不会被修改)。有一个更好的方法来解决这个问题-

struct list* hashInsert(char* string){
    return create(string);
}

除此之外的几点,不要使用 string,始终使用 char*,因为那才是真正的。我看到你正在使用一些库,但你最好自己包含正确的 headers,在这种情况下,你应该包含 stdlib.h,因为它包含 malloc() 的定义。