【发布时间】: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<=n/2..r1[i]=r[i];超出范围。 -
好的,我改成 i
-
我回滚了这个问题,所以答案是有意义的。接受答案后请不要更改问题。而是提出一个新问题。
-
糟糕!好吧,我的坏!已采纳建议。