分配数组时Mergesort中的分段错误-c

分配数组时Mergesort中的分段错误-c,c,mergesort,C,Mergesort,我已经用c写了一个合并排序程序,但是出现了一个分段错误。在试着调试我的代码之后,我知道了我得到错误的那一行,但我想知道原因是什么 这是我的密码: void Mergesort(struct record r[],int n) { int k; if(n>1) { int i,j; struct record r1[n/2]; struct record r2[n/2]; for(i=0,j=n/2;i&

我已经用c写了一个合并排序程序,但是出现了一个分段错误。在试着调试我的代码之后,我知道了我得到错误的那一行,但我想知道原因是什么

这是我的密码:

void Mergesort(struct record r[],int n)
{
    int k;
    if(n>1)
    {
        int i,j;
        struct record r1[n/2];
        struct record r2[n/2];
        for(i=0,j=n/2;i<n/2,j<n;i++,j++)
        {
            r1[i]=r[i];
            r2[i]=r[j]; // this is the line where i am getting the error.
        }
        Mergesort(r1,n/2);
        Mergesort(r2,n/2);
        r=Merge(r1,r2,r,n);
    }

}

struct record * Merge(struct record r1[],struct record r2[],struct record r[],int n)
{
    int i=0,j=0,k=0;
    while(i<n/2 && j<n/2)
    {
        if (strcmp(r1[i].a,r2[j].a)<=0)
        {
            r[k]=r1[i];
            i=i+1;
        }
        else
        {
            r[k]=r2[j];
            j=j+1;
        }
        k=k+1;
    }
    if(i==n/2)
    {
        for(j;j<n/2,k<n;j++,k++)
        {
            r[k]=r2[j];
        }

    }
    else
    {
        for(i;i<n/2,k<n;i++,k++)
        {
            r[k]=r1[i];
        }
    }
    return r;
}
void合并排序(结构记录r[],int n)
{
int k;
如果(n>1)
{
int i,j;
结构记录r1[n/2];
结构记录r2[n/2];

对于(i=0,j=n/2;i对于
n==3
你得到
n/2==1
,你没有地方存储所有3项。最简单的解决方案(不能说是不是最好的)是使用
n/2
n-n/2
来调整子数组的大小。

当然是一个错误,因为for循环的多个条件用逗号分隔:条件
i错误是因为当条目数为奇数时,分配不足。
示例:
当n=7时,n/2为3。因此,r1和r2的大小都为3,总共为6。在for循环中,
i
小于
3
(即0,1,2),
j
具有初始值
3
和最大值
6
(因此为3,4,5,6)。因此
j
需要4,但
r2
只有3个元素的内存。因此,它崩溃

幂为2时不会发生这种情况,因为即使将数组除以2,它们仍然是2的幂,甚至除了1。当只有一个元素时,您不必做任何事情


我认为您需要为
r2

分配
n-n/2
,在递归函数中根本不需要声明数组。您需要一个指向段开头的指针和一个指向结尾的指针。
struct record r1[n/2];
听着,我把它改成了我把问题回滚了,这样答案才有意义。请不要在接受答案后更改问题。改为问一个新问题。哎呀!!好吧!我的建议不好!!谢谢大家帮我解决了。没有更多的分段问题。!!但是现在有一个奇怪的问题。代码甚至没有对记录进行排序ds如果给出了除2的幂以外的任何数字,它只是将它们按随机顺序排列。请帮助..!!提出一个新的问题,并提供详细信息。正如您所说,我已经为此问题提出了一个新问题。链接: