gpt4 book ai didi

c - 为什么我在创建此链接列表时遇到段错误?

转载 作者:行者123 更新时间:2023-11-30 14:46:14 25 4
gpt4 key购买 nike

我对 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");
}

最佳答案

您的 headadd_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com