[英]Segmentation fault (core dumped). Heapsort
我有这个可以在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 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;
}
错误的根源是什么? 如何清除此错误?
我试着用gdb作为解释调试代码在这里 。 但是我不能按照答案中的描述编译程序。 我使用了命令gcc myfile.c -ggdb myfile。 另外,使用命令:gcc myfile.c -o myfile我成功编译了程序,这给了我分段错误。 我究竟做错了什么? 谢谢。
在出现的错误maxheapify
当你检查哪些孩子是larg
:
if (arr[l]>arr[i] && l<=size) ...
您以错误的方式获得了支票。 当您阅读arr[l]
, l
可能会超出范围,这是分段违反。 如果您首先像这样检查边界:
if (l<=size && arr[l]>arr[i]) ...
如果l
超出范围,则不会发生读取访问。 (记住&&
和||
运营商短路评价:在a && b
, b
是从来没有检查,如果a
已经是false
,因为没有办法了整个表达式可以实现的。)
之后检查arr[r]
几行也是如此。
另外,请包含<stdlib.h>
和<time.h>
; 它们是您的随机代码所必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.