簡體   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