我正在尝试使用 C++ 学习链表。这是我的代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
node *next;
};
void show(node *head)
{
node *n;
n=head;
while(n)
{
cout<<n->data<<' ';
n=n->next;
}
cout<<endl;
}
void insert(node *list,int x)
{
list->data=x;
node *t=new node;
list->next=t;
list=t;
}
int main()
{
node *head,*t,*list=new node;
head=list;
for(int i=0;i<10;i++)
{
insert(list,i+1);
}
show(head);
}
一开始我已经把head指向了内存列表指向的内存,但是insert调用了insert
函数后,head
指向了list的内存
指向,但它是否应该发生。 head 不是应该保持不变吗?
最佳答案
insert()
当在同一个 list
上重复调用时,会使 list->next
指向一个新的 node
.
该新节点未初始化,因此取消引用其 next
指针(如发生在 show()
中)会产生未定义的行为。一旦代码具有未定义的行为,所有赌注都将取消 - 任何事情都可能发生。
最终效果是,由于 insert()
的行为方式,show()
将表现出未定义的行为。
由于 list
是按值传递的,因此在 insert()
中分配给它没有任何效果。该分配对 main()
不可见。
list->next
指向的前一个节点也丢失了(未释放,不再可访问)。
main()
还使 list
未初始化,因此使用其成员(在 insert()
或 show()
) 导致未定义的行为,即使上述问题已修复。
关于C++指针不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351107/