[英]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.