为什么我的用于将元素插入到哈希树中的 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()
的定义。
我相当确定这与指针和使用副本的函数有关,但我不确定如何...因为我已将指针作为 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()
的定义。