【问题标题】:Segmentation Fault in Mergesort While assigning an array - c分配数组时合并排序中的分段错误-c
【发布时间】:2016-02-02 15:04:09
【问题描述】:

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

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

【问题讨论】:

  • 递归函数内部根本不需要声明数组。您需要一个指向段开头的指针和一个指向结尾的指针。
  • struct record r1[n/2]; .. i&lt;=n/2 .. r1[i]=r[i]; 超出范围。
  • 好的,我改成 i
  • 我回滚了这个问题,所以答案是有意义的。接受答案后请不要更改问题。而是提出一个新问题。
  • 糟糕!好吧,我的坏!已采纳建议。

标签: c mergesort


【解决方案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。当只有一个元素时,您无需执行任何操作。

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

【讨论】:

  • 感谢大家帮助我。没有更多的分割问题。!!但是现在有一个奇怪的问题。如果给出除 2 的幂以外的任何数字,该代码甚至不会对记录进行排序,而是将它们按随机顺序排列。请帮助..!!
  • 提出一个详细的新问题。
  • 正如你所说,我针对这个问题提出了一个新问题。链接:stackoverflow.com/questions/35158903/…
【解决方案2】:

肯定是一个错误,因为for循环的多个条件用逗号分隔:条件i&lt;n/2被简单地忽略了。详情请见here

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2021-03-24
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多