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

时间:2018-08-01 09:11:37

标签: c cs50

我相当确定这与指针和使用副本的函数有关,但是我不确定如何...因为我已经将指针作为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);
}

2 个答案:

答案 0 :(得分:3)

您的hashInsert函数创建了指针的本地副本(theList,您修改了该本地副本,但是main函数中的实际指针仍设置为{{1 }}。对此调用NULL是造成分段错误的原因。

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

printf

然后命名

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

这样,您可以从hashInsert(&names[num], "heey"); 修改指针的值。

编辑

此外,作为注释状态,您的main确实没有分配足够的内存,您还需要一些内存来存储下一个列表指针。

答案 1 :(得分:2)

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

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

除此之外,请不要使用string,而应始终使用char*,因为实际上它是。我看到您正在使用某些库,但是最好自己自己包括适当的标头,在这种情况下,您应该包括stdlib.h,因为它包含malloc()的定义。