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

标签 c segmentation-fault

我对 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/

相关文章:

c - 总线错误。无法访问内存

C - 访问哈希表中的结构成员时出现段错误(插入函数)

c - 将结构写入映射内存文件(mmap)

c - 注册虚拟机和加载/存储架构?

c - typedef 有什么用,它的正确用途是什么?

c - 退出时出现段错误(EXIT_FAILURE)但没有错误(EXIT_FAILURE,...)

使用ascii在C中大写字母

c - 您如何定位和修复段错误?

c++ - "gtk_text_buffer_get_bounds"函数导致 SEGFAULT

c++ - 字符串数组 C++ 的段错误