此程序中的分段错误
Segmentation fault in this program
很快:我有两个线性链表,它们表示一个多项式。我必须把它们相乘。我把所有的东西都写在这里了。唯一的问题是,我在一行上遇到了分段错误(if(n.grad<r->a.grad)
-也在下面的代码中标记)。
我在Borland尝试过这个程序,它有效!
在CodeBlocks或MinGW中,它只是崩溃。
#include <iostream>
using namespace std;
struct poli
{
int grad;
float coe;
};
struct Nod
{
poli a;
Nod *adr;
};
Nod *v,*sf,*v1,*vs,*vp;
void add_first(Nod *&v, poli n)
{
if(v)
{
Nod *p;
p=new Nod;
p->a=n;
p->adr=v;
v=p;
}
else
{
v=new Nod;
sf=v;
v->a=n;
v->adr=0;
}
}
void add_last(Nod *&v, poli n)
{
if(!v)
{
v=new Nod;
v->a=n;
v->adr=0;
}
else
{
Nod *p,*sf;
sf=v;
while(sf->adr)
sf=sf->adr;
p=new Nod;
p->a=n;
p->adr=0;
sf->adr=p;
sf=p;
}
}
void add_before(Nod *v, int val, poli val_add)
{
Nod *p, *q;
if(v->a.grad==val)
{
p=new Nod;
p->a=val_add;
p->adr=v;
v=p;
}
else
{
p=v;
while(p->adr->a.grad!=val&&p->adr->adr)
p=p->adr;
if(p->adr->a.grad==val)
{
q=new Nod;
q->a=val_add;
q->adr=p->adr;
p->adr=q;
}
}
}
void produs(Nod *v, Nod *v1, Nod *&vp)
{
Nod *p,*q,*r;
int gasit;
poli n;
p=v;
while(p)
{
q=v1;
while(q)
{
n.grad=p->a.grad+q->a.grad;
n.coe=p->a.coe*q->a.coe;
r=vp;
gasit=0;
while(r)
{
if(n.grad==r->a.grad)
{
r->a.coe+=n.coe;
gasit=1;
}
r=r->adr;
}
if(!gasit)
{
r=vp;
if(n.grad<r->a.grad) /////////////// HERE I get the call stack
add_first(vp,n);
else
{
while(r->adr&&n.grad>r->adr->a.grad)
r=r->adr;
if(r->adr&&n.grad<r->adr->a.grad)
add_before(vp,r->adr->a.grad,n);
else
add_last(vp,n);
}
}
q=q->adr;
}
p=p->adr;
}
}
void tipar(Nod *v)
{
Nod *p;
p=v;
while(p)
{
cout<<"+"<<p->a.coe<<"x^"<<p->a.grad;
p=p->adr;
}
}
int main()
{
int n,m,i;
poli a;
cout<<"Cate elemente are polinomu' 1?";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Baga gradu'";
cin>>a.grad;
cout<<"Introdu-mi coe";
cin>>a.coe;
add_last(v,a);
add_last(vs,a);
}
cout<<"Cate elemente are polinomu' 2?";
cin>>m;
for(i=0;i<m;i++)
{
cout<<"Baga gradu'";
cin>>a.grad;
cout<<"Introdu-mi coe";
cin>>a.coe;
add_last(v1,a);
}
produs(v,v1,vp);
tipar(vp);
return 0;
}
以下是调用堆栈窗口内容:
#0 004016C4 produs (v=0x4d25a0, v1=0x4d26b8, vp=@0x474018) at F:Programema ballz(23.02) (F:Programesuma polinommain.cpp:142)
#1 004019F2 main () at F:Programema ballz(23.02) (F:Programesuma polinommain.cpp:195)
看起来vp
是NULL或垃圾,然后执行r = vp
可能为NULL,因为它没有落入循环中。它有一个垃圾值,因为你从来没有用值初始化过它。你一开始就声明了。
无论如何,您应该学会为变量指定有意义的名称,这样它将更具可读性,从而更易于维护。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?