c++ - 此程序中的段错误

标签 c++ segmentation-fault codeblocks callstack

简而言之:我有两个代表多项式的线性链表。我必须将它们相乘。我已经把一切都写在这里了。唯一的问题是我在一行中遇到段错误(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:\Programe\ma ballz(23.02) (F:\Programe\suma polinom\main.cpp:142)
#1 004019F2 main () at F:\Programe\ma ballz(23.02) (F:\Programe\suma polinom\main.cpp:195)

最佳答案

看起来 vpNULL,或者是垃圾,然后你执行 r = vp...
可能是 NULL,因为它没有落入循环。 它有一个垃圾值,因为你从来没有用一个值初始化它。您只需在开头声明即可。

无论如何,你应该学会给你的变量起有意义的名字,这样它会更具可读性和可维护性。

关于c++ - 此程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9421272/

相关文章:

c++ - 当作为 Lambda 实现时,auto 的扣除不起作用。错误 : before deduction of 'auto'

C++ 预编译 header : Two generated . gch 对于同一源文件从不相同

python - PyODBC Cursor.fetchall() 导致 python 崩溃(segfault)

c++ - Strchr 不工作,或者我需要一个替代方法来检查给定字符串中的任何字符是否属于另一个字符串

c++ - 如何在 Code::Blocks 中使用 wmain() 入口点?

c++ - 代码块中的内部错误

c++ - 如何在 C++ 中以特定大小读取和存储未知类型的数据?

c++ - 为什么我不能将我的 QDialog 设置为没有 sizeGrip?

c++ - 大数组上的段错误

c - 尝试克隆函数时出现段错误(在 C 中)