C 中基于字符串的链表会产生分段错误


----------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
    char *val;
    struct node *next;
};
void add_to_list(struct node **, char *);
void list_all_elements(struct node *);
int main (int argc, char **argv)
{
    char *val;
    struct node *head = NULL;
    do  {
        scanf("%s",val);
        add_to_list(&head, val);
    }
    while(val[0] != '\');
    list_all_elements(head);
}
void add_to_list(struct node **head, char *val) 
{
    //This produces a segfault
    struct node *temp = malloc(sizeof *temp);
    //EDIT - Fixed as per comments
    temp->val = malloc(strlen(val) + 1);
    strcpy(temp->val, val);
    temp->next = NULL;
    if(head!=NULL)
        temp->next = *head;
    *head = temp;
}
void list_all_elements(struct node *head)   
{
    while(head!=NULL)   {
        printf("%sn",head->val);
        head = head->next;
    }
}

这就是我编译的实现链表的内容。现在,由于某种原因,错误定位会产生分段错误。

可以肯定的是,我用字符 [] 替换了 char *,代码运行良好。malloc 故障是由于这个还是我似乎找不到一些微不足道的错误?

您没有在主中分配 val

char *val;
...
scanf("%s",val);

但是这里没有分配val,当你做 scanf 时,它会去 sigsegv

您没有分配变量 val 指向的内存以及要读取字符串的位置。

char *val;
//... 
do  {
    scanf("%s",val);
    add_to_list(&head, val);
}

变量 val 未初始化,因此程序具有未定义的行为。

并且函数add_to_list无效。例如,sizeof(val)始终具有相同的值,该值等于指向字符的指针的大小。它不会产生此指针指向的字符串的大小。代替运算符sizeof您应使用功能strlen

该函数可以写成

void add_to_list( struct node **head, const char *val ) 
{
    struct node *temp = malloc( sizeof *temp );
    size_t n = strlen( val );
    temp->val = malloc( n + 1 );
    strcpy( temp->val, val );
    temp->next = *head;
    *head = temp;
}
temp->val = malloc(sizeof(val));

sizeof(val)更改为strlen(val)+1

相关内容

  • 没有找到相关文章

最新更新