C 分段故障(堆芯倾倒)。堆

C 分段故障(堆芯倾倒)。堆,c,linux,gcc,runtime-error,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 maxh

我有一个在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;
 }
#包括
#定义N 5000
int-arr[N];
int size=N-1;
int父级(int i)
{
返回(i-1)/2;
}
国际儿童(国际一)
{
返回2*i+1;
}
int-rchild(int-i)
{
返回2*i+2;
}
void maxheapify(int arr[],int i)
{
国际大,t;
int l=lchild(i);
int r=rchild(i);
如果(arr[l]>arr[i]&&larr[larg]&&r=0;i--)
maxheapify(arr,i);
}
无效堆口(int arr[]
{
int i,t;
buildmaxh(arr);
大小--;
对于(i=N-1;i>0;i--,大小--)
{
t=arr[0];
arr[0]=arr[i];
arr[i]=t;
maxheapify(arr,0);
}
}
int main()
{
srand(时间(空));
int i;

对于(i=0;i当您检查哪个子项较大时,
maxheapify
中出现错误:

if (arr[l]>arr[i] && l<=size) ...
如果
l
超出范围,则不会发生读取访问。(请记住
&
|
运算符会使计算短路:在
a&&b
中,如果
a
已经
为false
,则永远不会检查
b
,因为整个表达式不可能为true。)

这同样适用于检查
arr[r]
之后的一些行


另外,请包括
;它们是您的随机代码所必需的。

当您检查哪个孩子是大孩子时,错误发生在
最大值中:

if (arr[l]>arr[i] && l<=size) ...
如果
l
超出范围,则不会发生读取访问。(请记住
&
|
运算符会使计算短路:在
a&&b
中,如果
a
已经
为false
,则永远不会检查
b
,因为整个表达式不可能为true。)

这同样适用于检查
arr[r]
之后的一些行


另外,请包括
;它们是您的随机代码所需要的。

您应该使用
gcc myfile.c-ggdb-o myfile来编译它,以添加调试信息。
\0 0x0000000000400605在maxheapify(arr=0x600d00,i=4997)在heap.c:22\1 0x0000000000406c2在maxheapify(arr=0x600d00,i=2498)在heap.c:33#2 0x0000000000406ea in buildmaxh(arr=0x600d00)在heap.c:40#3 0x00000000004070e in heapsort(arr=0x600d00)在heap.c:45#4 0x0000000000407ff in main()在heap.c:61
l=9995
在第22行。但是您有一个大小为
5000
的数组。所以在执行
arr[i]时
在第22行您得到SEGFULT。您确定需要将
maxHeapify
递归。您得到的错误是第33行
i
值的两倍,这在第33行造成了问题22@arunmoezhi大小检查循环是否用于该目的。您应该使用
gcc myfile.c-ggdb-o myfile编译它ode>添加调试信息。在堆的maxheapify(arr=0x600d00,i=4997)中添加调试信息。在堆的maxheapify(arr=0x600d00,i=2498)中添加调试信息。在堆的maxheapify(arr=0x600d00,i=2498)中添加调试信息。在堆的buildmaxh(arr=0x600d00)中添加调试信息在第22行的heap.c:61
l=9995
。但是您有一个大小为
5000
的数组。因此,在执行
arr[l]>arr[i]时
在第22行您得到SEGFULT。您确定需要将
maxHeapify
递归。您得到的错误是第33行
i
值的两倍,这在第33行造成了问题22@arunmoezhi大小检查循环是否用于该目的。谢谢,它解决了问题。但是这个问题应该有surf在Windows上也是aced。为什么它在Windows上工作?我使用代码块在Windows上运行该程序。@Potato\u head:如果读取数组边界之外的内容,不能保证该程序会崩溃或发出任何类型的错误消息。C标准称之为“未定义行为”,并允许任何事情发生。程序可能会因错误而停止,它可能会默默地继续运行并给出错误的答案,甚至可能给出正确的答案。这取决于特定的系统、内存如何映射到进程的地址空间以及该内存的内容。谢谢,它解决了问题。但是这个问题也应该出现在Windows上。为什么它在Windows上工作?我使用代码块在Windows上运行该程序。@Potato\u head:如果读取数组边界之外的内容,不能保证程序会崩溃或发出任何错误消息。C标准称之为“未定义行为”,并允许任何事情发生。程序可能会因错误而停止,也可能会默默地继续并给出错误的答案,甚至可能给出正确的答案。这取决于特定的系统、内存如何映射到进程的地址空间以及内存的内容。