为什么在创建此链接列表时遇到细分错误?

时间:2018-09-23 19:32:00

标签: 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");
}

1 个答案:

答案 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