这是将两个字符串打印在一起的代码,但每当我尝试运行它时,都会出现分段错误,但它编译时没有任何错误,有人能帮忙吗?
#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 类型的对象
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;
}