我正在尝试一个基本程序,它将随机初始化一个链表并在用户指定的索引(getnth)上打印该值。但是,当我注释掉特定的cout行时,我遇到了一个奇怪的分段错误,当我取消注释它时它会消失。
#include<iostream>
#include<cstdlib>
using namespace std;
struct node
{
int x;
node *next;
};
void ins(struct node*& headRef, int n)
{
node *newNode = new node;
if (!newNode)
return;
newNode->x = n;
if (!headRef)
newNode->next = NULL;
else
newNode->next = headRef;
headRef = newNode;
cout<<"\n"<<n<<" inserted at "<<headRef<<"\n\n";
}
void disp(struct node* head)
{
node *temp = head;
if (!temp)
{
cout<<"\n\nLL empty\n";
return;
}
while (temp)
{
cout<<temp->x<<" ";
temp = temp->next;
}
cout<<"\n\n";
}
void getnth(struct node* head, int n)
{
int i=0;
node *temp = head;
while (temp)
{
if (i == n)
{
cout<<"\n"<<temp->x<<"\n\n";
return;
}
}
cout<<"\nIndex too high\n";
}
int main()
{
node *head;
int i;
srand(time(NULL));
for (i=0; i<10; i++)
{
ins(head, rand()%10+1);
cout<<"Main head is "<<head<<"\n"; // segfault appears if this line is commented out, disappears if it's not
}
cout<<"\nInitial LL\n\n";
disp(head);
cout<<"\nEnter index ";
cin>>i;
getnth(head, i);
return 0;
}
答案 0 :(得分:4)
在main
初始化
node *head=NULL;
并且您的getnth
错了,请修复它。
可能是这样的: -
void getnth(struct node* head, int n)
{
int i=0;
node *temp = head;
while (temp)
{
if (++i == n)
{
cout<<"\n"<<temp->x<<"\n\n";
return;
}
temp=temp->next;
}
cout<<"\nIndex too high\n";
}
答案 1 :(得分:0)
默认情况下,“main()”中的指针“head”使用garbage初始化,因为它是在程序堆栈上分配的自动变量。
因此,当您将指针“head”传递给函数“disp()”时,此指针将被解除引用并导致分段错误。
你必须明确地用0初始化指针“head”,这将解决问题。