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