我正在我的计划上实施单链表。现在我有这个显示功能来显示我的单链表中的内容。现在的问题是当我调用我的显示功能时。它只打印头部。例如20-->NULL
。用于检查我是否正确实现单链表的显示功能。
struct node
{
int data;
struct node *next;
}*start=NULL;
void display()
{
struct node *new_node;
printf("The Linked List : ");
new_node=start;
while(new_node!=NULL)
{
printf("%d--->",new_node->data);
new_node=new_node->next;
}
printf("NULL");
}
void creat(int num)
{
struct node *new_node,*current;
new_node=malloc(sizeof(struct node));
new_node->data=num;
new_node->next=NULL;
if(start==NULL)
{
start=new_node;
current=new_node;
}
else
{
current->next=new_node;
current=new_node;
}
//printf("%d->",new_node->data);
}
void main()
{
int binrange,max=100,n,i,divi;
int inp[4];
clrscr();
printf("enter 5 numbers: ");
for(i=0;i<5;i++)
{
scanf("%d",&inp[i]);
}
printf("\nenter range: ");
scanf("%d",&binrange);
n=max/binrange;
divi=max/n;
for(i=0;i<=max;i++)
{
if(i%divi==0 && i>0)
{
//create nodes here
//store i into nodes
creat(i);
}
}
display();
getch();
}
答案 0 :(得分:1)
在您的代码中,您正在定义
int inp[4];
然后你正在阅读
for(i=0;i<5;i++)
{
scanf("%d",&inp[i]);
}
当i
为4时,显然超过分配的内存[c中的数组索引从0
开始]。所以,undefined behaviour。
编辑:
此外,正如Joachim Pileborg先生所提到的,struct node * current
是creat()
函数的本地函数,因为每次函数完成时都超出范围。
副作用:
current
有垃圾[你没有初始化]。您需要一种存储值的方法。否则,再次,UB。
P.S - 两种情况都以自己的方式引起UB。 : - )答案 1 :(得分:1)
变量current
是creat
函数中的 本地 变量,它超出范围(&#34;消失& #34;)每次creat
函数退出。
这意味着两件事:每次调用函数时,变量都将始终未初始化,并且通过取消引用(未初始化的)指针undefined behavior。
未定义行为的原因仅仅是因为该变量未初始化。未初始化的非静态局部变量具有不确定值,实际上如果看起来是随机的。所以你正在做的是把这个指针指向&#34;随机&#34;位置并写信给它。
有三种可能的解决方案:一种是使current
变量static
,另一种是使其成为全局,第三种是根本没有它,每次都找到结束该函数被调用。哦,如果你先选择其中一个,你应该将它重命名为end
(或类似的东西),因为它是什么,指向列表末尾的指针。