C语言中基于字符串的链表产生分段错误 ---------- #包括 #包括 #包括 结构节点{ char*val; 结构节点*下一步; }; void将_添加到_列表(结构节点**,字符*); 无效列表所有元素(结构节点*); int main(int argc,字符**argv) { char*val; 结构节点*head=NULL; 做{ scanf(“%s”,val); 将\添加到\列表中(&head,val); } 而(val[0]!='\\'); 列出所有元素(标题); } void add_to_list(结构节点**头,字符*val) { //这会产生一个分段故障 结构节点*temp=malloc(sizeof*temp); //编辑-根据注释进行修复 temp->val=malloc(strlen(val)+1); strcpy(温度->值,值); temp->next=NULL; if(head!=NULL) 温度->下一步=*头部; *压头=温度; } 无效列表所有元素(结构节点*头) { while(head!=NULL){ printf(“%s\n”,head->val); 头部=头部->下一步; } }

C语言中基于字符串的链表产生分段错误 ---------- #包括 #包括 #包括 结构节点{ char*val; 结构节点*下一步; }; void将_添加到_列表(结构节点**,字符*); 无效列表所有元素(结构节点*); int main(int argc,字符**argv) { char*val; 结构节点*head=NULL; 做{ scanf(“%s”,val); 将\添加到\列表中(&head,val); } 而(val[0]!='\\'); 列出所有元素(标题); } void add_to_list(结构节点**头,字符*val) { //这会产生一个分段故障 结构节点*temp=malloc(sizeof*temp); //编辑-根据注释进行修复 temp->val=malloc(strlen(val)+1); strcpy(温度->值,值); temp->next=NULL; if(head!=NULL) 温度->下一步=*头部; *压头=温度; } 无效列表所有元素(结构节点*头) { while(head!=NULL){ printf(“%s\n”,head->val); 头部=头部->下一步; } },c,string,pointers,linked-list,C,String,Pointers,Linked List,这就是我编译来实现链表的内容。现在,由于某种原因,malloc’ing产生了一个分段错误 当然,我用char[]替换了char*,代码运行得很好。malloc故障是由此引起的还是有一些我似乎找不到的小错误 ---------- #include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char *val; struct node *next; }; vo

这就是我编译来实现链表的内容。现在,由于某种原因,malloc’ing产生了一个分段错误

当然,我用char[]替换了char*,代码运行得很好。malloc故障是由此引起的还是有一些我似乎找不到的小错误

----------
#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("%s\n",head->val);
        head = head->next;
    }
}
sizeof(val)
更改为
strlen(val)+1


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

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

temp->val = malloc(sizeof(val));
变量val未初始化,因此程序具有未定义的行为

并且函数
将\u添加到\u列表
无效。例如,
sizeof(val)
的值始终与指向char的指针的大小相同。它不会产生该指针指向的字符串大小。您应使用函数
strlen

这个函数可以写成

char *val;

//... 

do  {

    scanf("%s",val);
    add_to_list(&head, val);

}

您没有分配变量
val
指向的内存,也没有分配读取字符串的位置

temp->val = malloc(sizeof(val));
变量val未初始化,因此程序具有未定义的行为

并且函数
将\u添加到\u列表
无效。例如,
sizeof(val)
的值始终与指向char的指针的大小相同。它不会产生该指针指向的字符串大小。您应使用函数
strlen

这个函数可以写成

char *val;

//... 

do  {

    scanf("%s",val);
    add_to_list(&head, val);

}

您没有在主目录中分配val

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;
}

但此处未分配
val
,当您执行此操作时,scanf将转到sigsegv

您未在主屏幕中分配val

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;
}


但是这里没有分配
val
,当您这样做时,scanf将转到sigsegv

strlen()+1,否则您将没有空间写入\0@user3576305:将
sizeof*temp
更改为
sizeof结构节点
。您正在取消对未初始化指针的引用。@凯文:不,这是使用sizeof操作的合法方式。没有问题。strlen()+1,否则您将没有空间写入\0@user3576305:将
sizeof*temp
更改为
sizeof结构节点
。您正在取消对未初始化指针的引用。@凯文:不,这是使用sizeof操作的合法方式。这没什么错。head不会为null,您应该选中*head,但这不会改变任何东西,这意味着每次分配temp->next=*head;这是正确的做法,您根本不需要if(以及temp->next=NULL)1
char*val-->
char val[最大字符串大小]
head不会为null,您应该选中*head,但这不会改变任何东西,这意味着每次分配temp->next=*head;这是正确的做法,您根本不需要if(以及temp->next=NULL)1
char*val-->
char val[最大字符串大小]这个!非常感谢。我太天真了!但是scanf不应该在那里抛出错误吗?@user3576305程序有未定义的行为,因此无法预测将发生什么。@user3576305也不要忘记释放所有分配的内存。是的。我只是在这里展示相关的代码。这个!非常感谢。我太天真了!但是scanf不应该在那里抛出错误吗?@user3576305程序有未定义的行为,因此无法预测将发生什么。@user3576305也不要忘记释放所有分配的内存。是的。我只是在这里显示相关代码。是的!就是这样。谢谢,是的!就是这样。非常感谢。