繁体   English   中英

分段故障(核心已转储)。 堆排序

[英]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 && bb是从来没有检查,如果a已经是false ,因为没有办法了整个表达式可以实现的。)

之后检查arr[r]几行也是如此。

另外,请包含<stdlib.h><time.h> 它们是您的随机代码所必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM