【发布时间】:2014-04-29 09:00:04
【问题描述】:
我有这个在 Windows 上运行的堆排序程序,但在 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;
}
错误的来源是什么?如何消除此错误?
我尝试按照here 的说明使用 gdb 调试代码。但是我无法按照答案中的描述编译程序。我使用了命令 gcc myfile.c -ggdb myfile。 另外,使用命令: gcc myfile.c -o myfile 我成功编译了程序,这给了我分段错误。 我究竟做错了什么? 谢谢。
【问题讨论】:
-
你应该用
gcc myfile.c -ggdb -o myfile编译它以添加调试信息。 -
#0 0x0000000000400605 in maxheapify (arr=0x600d00, i=4997) at heap.c:22 #1 0x00000000004006c2 in maxheapify (arr=0x600d00, i=2498) at heap.c:33 #2 0x00000000004006ea in buildmaxh (arr=0x600d00) at heap.c:40 #3 0x000000000040070e in heapsort (arr=0x600d00) at heap.c:45 #4 0x00000000004007ff in main () at heap.c:61 -
l=9995在第 22 行。但是您有一个大小为5000的数组。因此,在第 22 行执行arr[l]>arr[i]时,您会遇到段错误。你确定你需要maxHeapify是递归的。在第 33 行将i的值加倍时会出现错误,这会在第 22 行产生问题 -
@arunmoezhi if 循环中的大小检查用于此目的。
标签: c linux gcc runtime-error