C++ 函数调用之前的分段错误

C++ 函数调用之前的分段错误,c++,segmentation-fault,C++,Segmentation Fault,当我尝试执行此代码时,代码在执行print\u array中的cout语句之前崩溃。我不知道为什么! 但是,如果我在main函数中注释掉对mergesort的调用,则print\u数组将正常执行 #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++)

当我尝试执行此代码时,代码在执行
print\u array
中的
cout
语句之前崩溃。我不知道为什么! 但是,如果我在main函数中注释掉对
mergesort
的调用,则
print\u数组
将正常执行

#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错误。
谢谢大家

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

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

我的第一个想法是,这是一种堆栈损坏,在调用其他方法时会导致“堆栈溢出”。尝试在GDB中获取更多信息,尝试编译以提高调试级别并关闭gcc的优化(即-g3-O0)


此外,您可以使用“valgrind”软件查找损坏并将结果发布在此处。(很抱歉在此请求,但我无法发表评论)。

我的第一个想法是,这是堆栈损坏,在调用其他方法时会导致“堆栈溢出”。尝试在GDB中获取更多信息,尝试编译以提高调试级别并关闭gcc的优化(即-g3-O0)


此外,您可以使用“valgrind”软件查找损坏并将结果发布在此处。(很抱歉在此请求,但我无法发表评论)。

调试器在哪一行说seg故障发生?您没有刷新输出。添加一个
endl
。我将
int
添加到
main
。作为发布,您的代码不应该编译为C++。C++没有原始C的隐式int。这就引出了一个问题:这是真正的代码吗?我的代码是编译的。。。。此外,gdb输出在mergesort(int*,int,int)中表示seg错误(),我在C++98和C++11上尝试过(使用-std=C++11和g++)。调试器在哪一行表示seg错误发生?您没有刷新输出。添加一个
endl
。我将
int
添加到
main
。作为发布,您的代码不应该编译为C++。C++没有原始C的隐式int。这就引出了一个问题:这是真正的代码吗?我的代码是编译的。。。。此外,gdb输出显示mergesort(int*,int,int)中存在seg错误(),我在C++98和C++11上尝试过(使用-std=C++11和g++)。问题是程序甚至在调用
mergesort
函数之前就崩溃了。它甚至没有像在
print\u array
@LockStock中那样打印元素,正如在您的问题的一条评论中提到的,您的输出没有被刷新,因此您没有看到它。你需要添加一个
cout啊是的,就是这样!问题是程序甚至在调用
mergesort
函数之前就崩溃了。它甚至没有像在
print\u array
@LockStock中那样打印元素,正如在您的问题的一条评论中提到的,您的输出没有被刷新,因此您没有看到它。你需要添加一个
cout啊是的,就是这样!
#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);
}