在我输入第一个数字后,它显示分段错误,我不知道为什么。我的目标是制作一个链接列表,其中我有一个根是某个数字,并输入更多的数字,这些数字最终将添加到链接列表的一部分。例如,根/第一个数字将是50。我会添加一个更大的数字60,它将被添加到lin列表下的另一个节点。这个过程将重复,因为我认为输入的数字会越来越大。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num;
struct node* left;
struct node* right;
}
node;
int main(void){
printf("Put in a number:");
int x = 0;
scanf("%i", x);
node* a = malloc(sizeof(node));
a->num = x;
node* temp = a;
int n = 1;
while(n == 1){
printf("Put in another number:");
int y = 0;
scanf("%i", y);
while(n == 1){
if (temp->num < y){
if (temp->right == NULL){
node* a = malloc(sizeof(node));
temp->right = a;
temp->right->num = y;
break;
}
else{
temp = temp->right;
}
}
printf("Want to stop? Yes(1) or No (1)?");
scanf("%i", n);
}
}
}
您的问题可能会避免在编译器中启用警告(GCC为-Wall
(始终检查警告,即使看起来编译仍在进行(-W error
可以避免这种情况(。
通过调用scanf ()
,您对您的程序说:"从stdin
读取输入,如果它与我定义的格式说明符匹配,则将其存储到特定地址">。
所以基本上,它期望你传递给它的每个格式说明符都有一个地址
带
scanf("%i", x);
您正在传递x
,这不是一个地址,因此scanf
将尝试在那里写入,导致分段错误,因为它可能是一个无效地址,不属于操作系统分配给进程的段。
相反,您需要使用一元运算符&
:将x
的地址传递给
scanf("%i", &x);
(当您为y
和n
变量调用scanf
时,同样的错误重复出现(
scanf 调用的参数
scanf("%i", x);
scanf("%i", y);
scanf("%i", n);
不正确。您必须通过引用传递变量
scanf("%i", &x);
scanf("%i", &y);
scanf("%i", &n);
此while loop
while(n == 1){
if (temp->num < y){
if (temp->right == NULL){
node* a = malloc(sizeof(node));
temp->right = a;
temp->right->num = y;
break;
}
else{
temp = temp->right;
}
}
printf("Want to stop? Yes(1) or No (1)?");
scanf("%i", n);
}
可以调用未定义的行为,因为对于新分配的节点
if (temp->right == NULL){
node* a = malloc(sizeof(node));
temp->right = a;
temp->right->num = y;
break;
}
您没有将其数据成员right
设置为NULL
。所以它具有不确定的价值。因此,如果语句
if (temp->right == NULL){
在该声明之后
temp = temp->right;
将该不确定值与CCD_ 14进行比较。
在输出的字符串中似乎有一个拼写错误
printf("Want to stop? Yes(1) or No (1)?");
^^^^ ^^^