分段故障甚至在调用函数之前

时间:2015-11-01 01:20:41

标签: c++ segmentation-fault

当我尝试执行此代码时,代码在cout中的print_array语句执行之前崩溃。我不知道为什么 ! 但是,如果我在主函数中注释掉mergesort的调用,print_array执行正常。

#include<iostream>
using namespace std;
void print_array( int A[], int n)
{
    int i;
    cout<<"\n Array elts:\t";
    for(i=0;i<n;i++) cout<<A[i]<<" ";
}
void mergesort(int A[], int beg, int end)
{
    if(beg>end) return;
    mergesort(A,beg,(beg+end)/2);
    mergesort(A, ((beg+end)/2)+1, end);
    int B[end-beg+1],i,j,k;
    i=beg; j=(beg+end)/2;
    k=0;
    while(i<(beg+end)/2 && j<end)
    {
        if(A[i] < A[j]) B[k++]=A[i++];
        else B[k++]=A[j++];
    }
    while(i<(beg+end)/2) B[k++]=A[i++];
    while(j<end) B[k++]=A[j++];
    for(i=beg; i<end; i++) A[i]=B[i];       

}   
int main()
{
    int n=10;
    int A[]={1,23,34,4,56,60,71,8,99,0};
    print_array(A,n);
    mergesort(A,0,n);
    print_array(A,n);
}

更新: 使用endl将刷新输出,print_array值将显示在屏幕上。除此之外,我遇到一个段错误的原因是因为我没有在mergesort中包含等式检查。这是更新的代码:

#include<iostream>
using namespace std;
void print_array( int A[], int n)
{
    int i;
    cout<<"\n Array elts:\t";
    for(i=0;i<n;i++) cout<<A[i]<<" ";
}
void mergesort(int A[], int beg, int end)
{
    if(beg>=end) return;
    mergesort(A,beg,(beg+end)/2);
    mergesort(A, ((beg+end)/2)+1, end);
    int B[end-beg+1],i,j,k;
    i=beg; j=(beg+end)/2;
    k=0;
    while(i<(beg+end)/2 && j<end)
    {
        if(A[i] < A[j]) B[k++]=A[i++];
        else B[k++]=A[j++];
    }
    while(i<(beg+end)/2) B[k++]=A[i++];
    while(j<end) B[k++]=A[j++];
    for(i=beg; i<end; i++) A[i]=B[i];       

}   
int main()
{
    int n=10;
    int A[]={1,23,34,4,56,60,71,8,99,0};
    print_array(A,n);
    mergesort(A,0,n);
    print_array(A,n);
}

代码绝不是应该做的,但它不再给出seg错误。 谢谢你们!

2 个答案:

答案 0 :(得分:0)

查看mergesort中的最后一行:您正在访问B中从begend的元素,但B为零索引。这是一个问题;可能会有更多。

答案 1 :(得分:0)

我的第一个问题是,这是一个Stack Corruption,导致了#Stack; Stack Overflow&#34;当你打电话给其他方法。尝试在GDB中获取更多信息,尝试编译增加调试级别并关闭gcc的优化(即-g3 -O0)。

此外,您可以使用&#34; valgrind&#34;用于查找损坏的软件并在此处发布结果。 (很抱歉在这里请求,但我不能发表评论)。