我对 C 非常陌生,我不明白代码中出现段错误的位置。我只是想创建一个链接列表,它将作为哈希表的类型单元。我知道我可能没有在应该使用的地方使用 malloc。主函数将运行,但只要我添加一项,就会出现段错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct word_link
{
char* val;
struct word_link * next;
} word_link;
void add_to_list(char* word, word_link *head);
void add_to_list(char* word, word_link *head){
int i;
word_link * temp = NULL;
word_link * p = NULL;
temp = (word_link*)malloc(sizeof(word_link));
temp->val = word;
temp->next = NULL;
if(head == NULL){
head = temp;
} else {
p = head;
while(p->next != NULL){
p = p->next;
}
p->next = temp;
}
}
void main() {
int i = 0;
struct word_link *lst = malloc(sizeof(word_link));
char* word = "";
while(i == 0){
printf("what to add? ");
scanf("%s",word);
add_to_list(word, lst);
printf("continue? ");
scanf("%d", i);
}
printf("%s", lst->val);
printf("%s", "asdf;kl");
}
最佳答案
您的 head
是 add_to_list
函数的本地函数,一旦控件退出 add_to_list
函数,该函数就会被销毁。
此外,对 add_to_list
内的 head
所做的任何更改都不会影响原始头 lst
。
解决方案:
您可以传递原始头的引用来插入,以保留在 add_to_list
中所做的更改,如下所示。
void add_to_list(char* word, word_link **head);
void add_to_list(char* word, word_link **head){
int i;
word_link * temp = NULL;
word_link * p = NULL;
temp = (word_link*)malloc(sizeof(word_link));
if (temp == NULL) return;
temp->val = word;
temp->next = NULL;
if(*head == NULL){
*head = temp;
} else {
p = *head;
while(p->next != NULL){
p = p->next;
}
p->next = temp;
}
}
然后您调用add_to_list
,如下所示。
add_to_list(word, &lst);
另一个问题:
char* word = "";
这将创建 word
作为指向不可变字符串文字的指针。修改 word
内容 scanf("%s",word);
将导致 UB,因为每次您将相同的指针传递给 add_to_list
列表中的每个节点都将指向相同的单词
。
您可能想按如下方式声明它。
char *word = malloc(256);
在 while 循环内并将其传递给 add_to_list
。
关于c - 为什么我在创建此链接列表时遇到段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52469556/