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