![](/img/trans.png)
[英]Why am I getting a Segmentation fault when I try to add a new node to my linked list?
[英]Why am I getting a segmentation fault on this linked list creation?
我对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
将被销毁。
同样,在add_to_list
内部对head
所做的任何更改都不会影响原始head lst
。
解:
您可以传递要插入的原始add_to_list
的引用,以保留在add_to_list
所做的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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.