指针分配时出现分段错误
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是未定义的行为,因为你不知道你在改变内存的哪个区域。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?