[英]Segmentation fault while pointer assignment
編寫程序以反轉給定單鏈列表的方向。 換句話說,在反轉之后,所有指針現在都應該指向后。
我正在嘗試解決上述問題。 我編寫了用於單鏈表的插入,搜索和刪除以及打印的功能。
我的打印功能如下
void print(list **l)
{
list *p=*l;
for(int i=0;p;i++)
{
cout<<p->item<<endl;
p=p->next;
}
}
它可以很好地打印列表中的所有值。
但是在主函數中,如果我執行相同的分配
list *p=*l;
這給了我分割錯誤。 我的主要功能如下
main()
{
list **l;
*l=NULL;
int n;
while(cin>>n)
insert(l,n);
list *p=*l;
list *prev=NULL;
list *next;
while(p)
{
next=p->next;
p->next=prev;
prev=p;
if(next==NULL)
*l=p;
p=next;
}
print(l);
}
我的插入功能如下
void insert(list **l,int x)
{
list *p;
p=(list *)malloc(sizeof(list));
p->item=x;
p->next=*l;
*l=p;
}
我在打印功能和主功能之間的分配有什么區別? 為什么在打印功能中沒有出現任何錯誤,而在主功能中卻出現了分段錯誤?
如果我的職能是這樣的
main()
{
list **l;
*l=NULL;
int n;
while(cin>>n)
insert(l,n);
print(l);
}
我沒有任何錯誤,我能夠插入和打印列表的值。
當你寫
list **l;
*l=NULL;
您要取消引用無效的指針,因此會遇到未定義的行為。
在函數內部,您可能正在傳遞有效的指針作為參數。 例如
list* l;
void print(&l)
在這種情況下, &l
屬於list**
類型-並且它指向一個懸空的list*
,因此取消引用它會產生一個指針( l
本身)。 l
未初始化,但無法讀取。
你寫:
list **l;
*l=NULL;
但是l沒有分配,您不知道它的值,因此* l = NULL是未定義的行為,因為您不知道要更改的內存區域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.