C ++ 5.1中的分段错误但在C ++ 4.8.4中运行良好

时间:2016-08-19 07:59:51

标签: c++ segmentation-fault new-operator

我正在研究this问题,我用trie解决了它。它适用于我的计算机上的测试用例(使用GNU C ++ 4.8.4编译器),但它在Codeforces Judge和Ideone for C ++ 11(G ++ 5.1)上给出了分段错误(运行时错误11)。事实上,对于相同的测试用例,它在Ideone上的C ++ 4.3.2中运行良好

2 3
a
b

这是我的代码。

    #include <bits/stdc++.h>

using namespace std;

typedef struct node
{
    int status;
    int visited;
    struct node *children[26];
}node;

node *gen_node()
{
    node *newnode=new node();
    newnode->status=0;
    newnode->visited=0;
    int i=0;
    for(i=0;i<26;i++)
        newnode->children[i]=NULL;
}

void insert(node *root,string s)
{
    int n=s.size();
    int i;
    for(i=0;i<n;i++)
    {
        if(root->children[s[i]-'a']==NULL)
        {
            root->children[s[i]-'a']=gen_node();
        }
        root=root->children[s[i]-'a'];
    }
}

void dfs(node *root)
{
    root->visited=1;
    int flag=0,i;
    for(i=0;i<26;i++)
    {
        if(root->children[i]!=NULL && (root->children[i])->visited==0)
        {
            dfs(root->children[i]);
            flag=1;
        }
    }
    if(flag==0)
    {
        root->status=0;
    }
    else
    {
        root->status=0;
        for(i=0;i<26;i++)
        {
            if(root->children[i]!=NULL)
            {
                root->status=(root->status)|(!((root->children[i])->status));
            }
        }
    }
}

int main()
{
    int n,k;
    cin>>n>>k;
    node *root=gen_node();
    int i;
    for(i=0;i<n;i++)
    {
        string s;
        cin>>s;
        insert(root,s);
    }
    dfs(root);
    if(root->status==0)
    {
        cout<<"Second"<<endl;
    }
    else
    {
        int flag=0;
        for(i=0;i<26;i++)
        {
            if(root->children[i]!=NULL)
            {
                if((root->children[i])->status==1)
                {
                    flag=1; //root has atleast one losing strategy
                }
            }
        }
        if(flag==0)
        {
            if(k%2==0)
            {
                cout<<"Second"<<endl;
            }
            else
            {
                cout<<"First"<<endl;
            }
        }
        else
        {
            cout<<"First"<<endl;
        }
    }
    return 0;
}

我曾尝试在Ideone上调试(无法使用gdb :(),并发现segfault在insert()函数中发生(通过注释和取消注释)。

if(root->children[s[i]-'a']==NULL)
        {
            root->children[s[i]-'a']=gen_node();
        }

我不确定这是怎么发生的。任何人都可以帮助我吗?

0 个答案:

没有答案