代码之家  ›  专栏  ›  技术社区  ›  Anakin

未知原因的程序出口(0xC000 00)

c++
  •  0
  • Anakin  · 技术社区  · 7 年前

    我在练习最长的递增序列问题,我使用了以下代码:

    int lis(vector<int>& a)
    {
        int s = a.size();
        vector<int> prev(s);
        vector< vector<int> > pile;
        int m = -1; // lis size
        for(int i=0; i<s; i++)
        {
            // initialize piles
            vector<int> vt;
            pile.push_back(vt);
        }
    
        pile[0].push_back(0); // a[0] must go to the first pile
        prev[0] = -1;
    
        for(int i=1; i<s; i++)
        {
            cout << "i: " << i << endl;
            for(int j=0; j<s; j++)
            {
                cout << "j: " << j << endl;
                if(pile[j].size() == 0)
                {
                    printf("pile %d is empty, push %d (%d)\n", j, i, a[i]);
    
                    pile[j].push_back(i);
                    if(j == 0)
                    {
                        prev[i] = -1;
                    }
                    else
                    {
                        prev[i] = pile[j-1].back();
                    }
    
                    m = max(j, m);
                    break;
                }
                else if(a[pile[j].back()] < a[i])
                {
                    printf("go to pile %d\n", j+1);
                    continue;
                }
                else
                {
                    printf("push %d (%d) to pile %d\n", i, a[i], j);
    
                    pile[j].push_back(i);
                    if(j == 0)
                    {
                        prev[i] = -1;
                    }
                    else
                    {
                        prev[i] = pile[j-1].back();
                    }
    
                    m = max(j, m);
                    break;
                }
            }
        }
    
        // print out the sequences
        int ind = pile[m][0];
        vector<int> res;
        while(ind != -1)
        {
            res.push_back(a[ind]);
            ind = prev[ind];
        }
        for(int i=res.size()-1; i>=0; i--)
        {
            cout << res[i] << " ";
        }
    
        return m+1; // return lis size
    }
    

    也就是说,工作很好。然后,我想简化代码,并得出这样的结论:

    int lis(vector<int>& a)
    {
        /* same */
    
        for(int i=1; i<s; i++)
        {
            cout << "i: " << i << endl;
            for(int j=0; j<s; j++)
            {
                cout << "j: " << j << endl;
                if(a[pile[j].back()] > a[i] || pile[j].size() == 0)
                {
                    printf("push %d to pile %d\n", a[i], j);
    
                    pile[j].push_back(i);
                    prev[i] = (j == 0) ? -1 : pile[j-1].back();                    
                    m = max(j, m);
    
                    break;
                }
                printf("go to pile %d\n", j+1);
            }
        }
    
        /* same */
    }
    

    有了这个代码,当它进入下一堆时 ( j 增加) 程序突然退出。(返回进程 0xC0000005 )
    这不能是缓冲区溢出或分段错误,因为每个向量/数组都已正确声明,并且索引未超出界限。
    这也不能是内存泄漏或悬挂指针,因为我没有使用任何手动分配。
    我解决不了!

    Program exits after j++

    我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   goodvibration    7 年前

    首先,在下面的语句中:

    if(a[pile[j].back()] > a[i] || pile[j].size() == 0)
    

    我认为你应该先检查一下表达式的第二部分。

    换句话说,检查 pile[j].size() == 0 首先,为了避免打电话 pile[j].back() 如果是真的。