分段错误(核心转储)。堆排序

时间:2014-04-29 09:00:05

标签: 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 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我成功编译了程序,这给了我分段错误。 我究竟做错了什么? 感谢。

1 个答案:

答案 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>;你的随机代码需要它们。