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

时间:2016-02-02 15:04:10

标签: c mergesort

我在c中编写了一个Merge Sort程序但是遇到了分段错误。在尝试调试我的代码后,我知道我得到错误的特定行,但我想知道是什么原因?

这是我的代码:

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;
}

还有一件事:我只是在没有时才会出现分段错误。我要排序的条目不是2的幂。代码正在运行2,4,8,16等条目。

3 个答案:

答案 0 :(得分:1)

对于pageNum,您获得#!/bin/bash export x=x ./run_unit_test并且您无法存储所有3个项目。最简单的解决方案(不能说最好的解决方案)是使用n==3n/2 == 1来确定子数组的大小。

答案 1 :(得分:1)

当然是一个错误,因为for循环的多个条件用逗号分隔:条件i<n/2被简单地忽略。有关详细信息,请参阅here

答案 2 :(得分:1)

错误是因为当您有奇数个条目时,您将处于分配状态。
例如:
当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.当只有一个元素时,你不必做任何事情。

我认为您需要为n - n/2分配r2