我是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");
}
答案 0 :(得分:1)
您的head
对于add_to_list
函数来说是本地的,一旦控件退出add_to_list
函数,它将被销毁。
在head
内部对add_to_list
所做的任何更改都不会影响原始头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
时,列表中的每个节点都将指向相同的word
。>
您可能要声明如下。
char *word = malloc(256);
在while循环内部,并将其传递给add_to_list
。