gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:19 24 4
gpt4 key购买 nike

我用 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 等条目,代码运行正常。

最佳答案

错误是因为当您有奇数个条目时,您分配不足。
示例:
当 n = 7 时,n/2 是 3。所以你有大小为 3 的 r1 和 r2,总共 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

关于c - Mergesort 中的段错误分配数组时 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com