C 分段故障(堆芯倾倒)。堆
我有一个在Windows上运行的heapsort程序,但是在ubuntu 14.04上出现了分段错误C 分段故障(堆芯倾倒)。堆,c,linux,gcc,runtime-error,C,Linux,Gcc,Runtime Error,我有一个在Windows上运行的heapsort程序,但是在ubuntu 14.04上出现了分段错误 #include<stdio.h> #define N 5000 int arr[N]; int size=N-1; int parent(int i) { return (i-1)/2; } int lchild(int i) { return 2*i+1; } int rchild(int i) { return 2*i+2; } void maxh
#include<stdio.h>
#define N 5000
int arr[N];
int size=N-1;
int parent(int i)
{
return (i-1)/2;
}
int lchild(int i)
{
return 2*i+1;
}
int rchild(int i)
{
return 2*i+2;
}
void maxheapify(int arr[],int i)
{
int larg,t;
int l=lchild(i);
int r=rchild(i);
if(arr[l]>arr[i] && l<=size)
larg=l;
else
larg=i;
if(arr[r]>arr[larg] && r<=size)
larg=r;
if(larg!=i)
{
t=arr[larg];
arr[larg]=arr[i];
arr[i]=t;
maxheapify(arr,larg);
}
}
void buildmaxh(int arr[])
{
int i;
for(i=N/2-1;i>=0;i--)
maxheapify(arr,i);
}
void heapsort(int arr[])
{
int i,t;
buildmaxh(arr);
size--;
for(i=N-1;i>0;i--,size--)
{
t=arr[0];
arr[0]=arr[i];
arr[i]=t;
maxheapify(arr,0);
}
}
int main()
{
srand(time(NULL));
int i;
for( i=0;i<N;i++)
arr[i]=rand()%101;
heapsort(arr);
printf("done\n\n");
return 0;
}
#包括
#定义N 5000
int-arr[N];
int size=N-1;
int父级(int i)
{
返回(i-1)/2;
}
国际儿童(国际一)
{
返回2*i+1;
}
int-rchild(int-i)
{
返回2*i+2;
}
void maxheapify(int arr[],int i)
{
国际大,t;
int l=lchild(i);
int r=rchild(i);
如果(arr[l]>arr[i]&&larr[larg]&&r=0;i--)
maxheapify(arr,i);
}
无效堆口(int arr[]
{
int i,t;
buildmaxh(arr);
大小--;
对于(i=N-1;i>0;i--,大小--)
{
t=arr[0];
arr[0]=arr[i];
arr[i]=t;
maxheapify(arr,0);
}
}
int main()
{
srand(时间(空));
int i;
对于(i=0;i当您检查哪个子项较大时,maxheapify
中出现错误:
if (arr[l]>arr[i] && l<=size) ...
如果l
超出范围,则不会发生读取访问。(请记住&
和|
运算符会使计算短路:在a&&b
中,如果a
已经为false
,则永远不会检查b
,因为整个表达式不可能为true。)
这同样适用于检查arr[r]
之后的一些行
另外,请包括
和
;它们是您的随机代码所必需的。当您检查哪个孩子是大孩子时,错误发生在最大值中:
if (arr[l]>arr[i] && l<=size) ...
如果l
超出范围,则不会发生读取访问。(请记住&
和|
运算符会使计算短路:在a&&b
中,如果a
已经为false
,则永远不会检查b
,因为整个表达式不可能为true。)
这同样适用于检查arr[r]
之后的一些行
另外,请包括
和
;它们是您的随机代码所需要的。您应该使用gcc myfile.c-ggdb-o myfile来编译它,以添加调试信息。\0 0x0000000000400605在maxheapify(arr=0x600d00,i=4997)在heap.c:22\1 0x0000000000406c2在maxheapify(arr=0x600d00,i=2498)在heap.c:33#2 0x0000000000406ea in buildmaxh(arr=0x600d00)在heap.c:40#3 0x00000000004070e in heapsort(arr=0x600d00)在heap.c:45#4 0x0000000000407ff in main()在heap.c:61
l=9995
在第22行。但是您有一个大小为5000
的数组。所以在执行arr[i]时
在第22行您得到SEGFULT。您确定需要将maxHeapify
递归。您得到的错误是第33行i
值的两倍,这在第33行造成了问题22@arunmoezhi大小检查循环是否用于该目的。您应该使用gcc myfile.c-ggdb-o myfile编译它ode>添加调试信息。在堆的maxheapify(arr=0x600d00,i=4997)中添加调试信息。在堆的maxheapify(arr=0x600d00,i=2498)中添加调试信息。在堆的maxheapify(arr=0x600d00,i=2498)中添加调试信息。在堆的buildmaxh(arr=0x600d00)中添加调试信息在第22行的heap.c:61
l=9995
。但是您有一个大小为5000
的数组。因此,在执行arr[l]>arr[i]时
在第22行您得到SEGFULT。您确定需要将maxHeapify
递归。您得到的错误是第33行i
值的两倍,这在第33行造成了问题22@arunmoezhi大小检查循环是否用于该目的。谢谢,它解决了问题。但是这个问题应该有surf在Windows上也是aced。为什么它在Windows上工作?我使用代码块在Windows上运行该程序。@Potato\u head:如果读取数组边界之外的内容,不能保证该程序会崩溃或发出任何类型的错误消息。C标准称之为“未定义行为”,并允许任何事情发生。程序可能会因错误而停止,它可能会默默地继续运行并给出错误的答案,甚至可能给出正确的答案。这取决于特定的系统、内存如何映射到进程的地址空间以及该内存的内容。谢谢,它解决了问题。但是这个问题也应该出现在Windows上。为什么它在Windows上工作?我使用代码块在Windows上运行该程序。@Potato\u head:如果读取数组边界之外的内容,不能保证程序会崩溃或发出任何错误消息。C标准称之为“未定义行为”,并允许任何事情发生。程序可能会因错误而停止,也可能会默默地继续并给出错误的答案,甚至可能给出正确的答案。这取决于特定的系统、内存如何映射到进程的地址空间以及内存的内容。