我有这个在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调试代码,如here所述。但是我无法按照答案中的描述编译程序。我使用命令gcc myfile.c -ggdb myfile。 另外,使用命令:gcc myfile.c -o myfile我成功编译了程序,这给了我分段错误。 我究竟做错了什么? 感谢。
答案 0 :(得分:4)
当您检查哪个孩子为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>
;你的随机代码需要它们。