主函数返回时的分段错误

时间:2014-07-07 20:27:04

标签: c++ memory-management segmentation-fault main

我编写的代码编译得很好但是返回了运行时错误。 n调试代码我发现错误是在返回0语句后从main函数返回的。 就我搜索的内容而言,我理解这是一个堆栈缓冲区溢出问题,但无法知道如何纠正它。 代码可在此处http://ideone.com/7ujF4D

获取
#include<iostream>
#include<algorithm>
using namespace std;
struct box{
    int h;
    int w;
    int l;
};
bool mycomp(const box &b1, const box &b2)
{
    return((b1.l*b1.w)>(b2.l*b2.w));
}
int boxstack(box b[4], int n)
{
    box * all = new box[3*n];
    //box *all = (box *)malloc(sizeof(box));
    int j = 0;
    //cout<<"here";
    int * msh = new int[3*n];
    //int* msh = (int*)malloc(sizeof(int));
    //cout<<"now here";
    for(int i=0; i<3*n; i++)
        {
            all[j].h = b[i].h;
            all[j].w = min(b[i].w,b[i].l);
            all[j].l = max(b[i].w, b[i].l);
            j++;
            all[j].h = b[i].l;
            all[j].w = min(b[i].w,b[i].h);
            all[j].l = max(b[i].w, b[i].h);
            j++;
            all[j].h = b[i].w;
            all[j].w = min(b[i].l,b[i].h);
            all[j].l = max(b[i].l, b[i].h);
            j++;
        }
    sort(b, b+3*n, mycomp);
    for(int i=0; i<3*n; i++)
        {
            int maxh = 0;
            for(int j=0; j<i; j++)
                {
                    if(all[j].w>all[i].w&&all[j].l >all[i].l)
                        {
                            if(maxh<msh[j])
                                {
                                    maxh = msh[j];
                                }
                        }
                }
            msh[i]=maxh + all[i].h;
        }
    int maxval = 0;
    for(int i=0; i<3*n; i++)
        {
            if(msh[i]>maxval)
                {
                    maxval = msh[i];
                }
        }
    //delete []all;
    //delete []msh;
    cout<<"Here";
    return maxval;
}
int main()
{
    box b[4];
    b[0].h=4;
    b[0].l=6;
    b[0].w=7;
    b[1].h=1;
    b[1].l=2;
    b[1].w=3;
    b[2].h=4;
    b[2].l=5;
    b[2].w=6;
    b[3].h=10;
    b[3].l=12;
    b[3].w=32;
    cout<<boxstack(b,4);
    cout<<"Hello";
    return 0;
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

在这里看看你的循环:

    for(int i=0; i<3*n; i++)
    {
        all[j].h = b[i].h;
        all[j].w = min(b[i].w,b[i].l);
        all[j].l = max(b[i].w, b[i].l);

        j++;  // increment 

        all[j].h = b[i].l;
        all[j].w = min(b[i].w,b[i].h);
        all[j].l = max(b[i].w, b[i].h);

        j++;  // increment again

        all[j].h = b[i].w;
        all[j].w = min(b[i].l,b[i].h);
        all[j].l = max(b[i].l, b[i].h);

        j++;  // increment once again
    }

在循环之前查看您的分配:

box * all = new box[3*n];
int j = 0;
int * msh = new int[3*n];

all3*n项,但您的循环不仅循环到3*n,而且在该循环内增加j 3次。 j的值最终将超出all的分配空间。