为什么它在我的代码中显示分段错误?

why does it show segmentation error in my code?

这是将两个字符串打印在一起的代码,但每当我尝试 运行 时,都会出现分段错误,但编译没有任何错误,有人可以帮忙吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    char *data; //string data in this node
    struct node *next; //next node or NULL if none
} Node;
void print(Node *head); //function prototype print
Node *push_node(Node x, Node *strlist);
int main ()
{
    Node node1;
    Node node2;
    Node *list = NULL;
    strcpy(node1.data, "world");
    push_node(node1, list);
    strcpy(node2.data, "hello");
    push_node(node2, list);
    print(list);
return 0;
}
void print(Node *head)
{
    Node *p = head;
    while (p != NULL)
    {
        printf("%s", p->data);
        p = p->next;
    }
}
Node *push_node(Node x, Node *strlist)
{
    x.next= strlist;
    return &x;
}

您声明了两个节点类型的对象

Node node1;
Node node2;

未初始化的数据成员。那就是对象的指针 data 具有不确定的值。

所以调用函数strcpy

strcpy(node1.data, "world");
strcpy(node2.data, "hello");

导致未定义的行为。

此外,指针 list 未在程序内更改。它在初始化时始终等于 NULL。所以调用函数 print 没有任何意义。

为了使您的代码至少能正常工作,您需要进行以下更改。

Node *push_node(Node *x, Node *strlist);

//...

node1.data = "world";
list = push_node( &node1, list);
node2.data = "hello";
list = push_node( &node2, list);
print(list);

//...

Node *push_node(Node *x, Node *strlist)
{
    x->next= strlist;
    return x;
}