为什么heapsort的这个C实现会出现分段错误?

为什么heapsort的这个C实现会出现分段错误?,c,segmentation-fault,heapsort,C,Segmentation Fault,Heapsort,我尝试在gcc和turboc中执行这段代码。在GCC中,它在运行时给我一个分段错误,在turbo中,它在运行时再次给我一个空指针分配错误 我试图追踪它,但我看不出问题出在哪里 #include<stdio.h> int heapsize; void heapify(int a[],int i) { int l=2*i,r=2*i+1,largest,temp; if(l<=heapsize && a[l]>a[i]) l

我尝试在gcc和turboc中执行这段代码。在GCC中,它在运行时给我一个分段错误,在turbo中,它在运行时再次给我一个空指针分配错误

我试图追踪它,但我看不出问题出在哪里

#include<stdio.h>

int heapsize;

void heapify(int a[],int i)
{
    int l=2*i,r=2*i+1,largest,temp;
    if(l<=heapsize && a[l]>a[i])
        largest=l;
    else
        largest=i;
    if(r<=heapsize && a[r]>a[largest])
        largest=r;
    if(largest!=i)
    {
        temp=a[i];
        a[i]=a[largest];
        a[largest]=temp;
        heapify(a,largest);
    }
}

void buildheap(int a[],int length)
{
    int i;  
    heapsize=length;    
    for(i=length/2;i>=0;i--)
        heapify(a,i);
}

void heapsort(int a[],int length)
{
    int i,temp; 
    buildheap(a,length);
    for(i=length-1;i>=1;i++)
    {
        temp=a[0];
        a[0]=a[i];
        a[i]=temp;
        heapsize--;         
        heapify(a,0);   
    }
}

void main()
{
    int a[20],i,length;
    printf("ENTER THE SIZE OF YOUR ARRAY:");
    scanf("%d",&length);
    printf("ENTER THE ARRAY ELEMENTS: \n");
    for(i=0;i<length;i++)
        scanf("%d",&a[i]);
    heapsort(a,length);
    printf("THE SORTED ARRAY IS:");
    for(i=0;i<length;i++)
        printf("%d /t",a[i]);
}
#包括
智力治疗;
void heapify(int a[],int i)
{
int l=2*i,r=2*i+1,最大,温度;
if(la[i])
最大=l;
其他的
最大=i;
如果(ra[最大])
最大=r;
如果(最大!=i)
{
温度=a[i];
a[i]=a[最大];
a[最大]=温度;
希皮菲(a,最大);
}
}
void buildheap(int a[],int length)
{
int i;
heapsize=长度;
对于(i=length/2;i>=0;i--)
希皮菲(a,i);
}
void堆口(int a[],int length)
{
int i,温度;
buildheap(a,长度);
对于(i=length-1;i>=1;i++)
{
温度=a[0];
a[0]=a[i];
a[i]=温度;
医治--;
heapify(a,0);
}
}
void main()
{
int a[20],i,长度;
printf(“输入数组的大小:”);
扫描频率(“%d”和长度);
printf(“输入数组元素:\n”);
对于(i=0;i
  • 如果用户输入的
    长度
    大于20,则肯定会溢出
    a
  • heapsort
    函数从未终止,因为
    i
    不断增长。您应该使用
    i--
  • 末尾的
    printf
    输出
    /t
    ,而不是选项卡。将其更改为
    \t
尽管排序看起来仍然不正确,但这些至少可以让您通过SEGFULT。

  • 如果用户输入的
    长度
    大于20,则肯定会溢出
    a
  • heapsort
    函数从未终止,因为
    i
    不断增长。您应该使用
    i--
  • 末尾的
    printf
    输出
    /t
    ,而不是选项卡。将其更改为
    \t

heapsort
函数中,应该使用
i--
而不是
for
循环中的
i++

heapsort
函数中,应该使用
i--
而不是
循环中的
i++
de>for
循环。

以下for循环将永远不会终止。索引不断增加,导致数组越界,这就是出现上述错误的原因

for(i=length-1;i>=1;i++)
{
    temp=a[0];
    a[0]=a[i];
    a[i]=temp;
    heapsize--;         
    heapify(a,0);   
}
更新:您的heapify()不正确。请尝试此操作

if(l<heapsize && a[l]>a[i])
    largest=l;
else
    largest=i;
if(r<heapsize && a[r]>a[largest])
    largest=r;
if(la[i])
最大=l;
其他的
最大=i;
如果(ra[最大])
最大=r;

以下for循环将永远不会终止。索引不断增加,导致数组越界,这就是出现上述错误的原因

for(i=length-1;i>=1;i++)
{
    temp=a[0];
    a[0]=a[i];
    a[i]=temp;
    heapsize--;         
    heapify(a,0);   
}
更新:您的heapify()不正确。请尝试此操作

if(l<heapsize && a[l]>a[i])
    largest=l;
else
    largest=i;
if(r<heapsize && a[r]>a[largest])
    largest=r;
if(la[i])
最大=l;
其他的
最大=i;
如果(ra[最大])
最大=r;


提供了非常简单的输入。我编辑了这个问题。你可以检查它。@chaitanyNetTM:以及你得到的错误,特别是当它包含行号时。它不包含行号。这是一个运行时错误。不是编译时错误。@chaitanyNetTM:我想这是我们讨论的C。你试过在调试器中运行它吗?是的我们说的是C。不,我还没有试过在调试器中运行它。我现在就运行它。提供了非常简单的输入。我编辑了这个问题。你可以检查它。@chaitanyNetTM:以及你得到的错误,特别是当它包含行号时。它不包含行号。这是一个运行时错误。不是编译时错误。@ChaitanyaN艾特姆:我想这是我们谈论的C。你试过在调试器中运行它吗?是的,这是我们谈论的C。不,我还没有试过在调试器中运行它。我现在就做。好的,清除了分段错误,但显然我的程序中有一个逻辑错误。输入:(2,4,3,1,9)我得到的输出是:(3013077,4,1,9,2)@ChaitanyaNettem-我已经更新了答案..以回答您的编辑。-我从某人的帮助中发现的另一个错误是,由于索引从0开始,l和r应该初始化为l=2*I+1和r=2*I+2。好的,这清除了分段错误,但显然我的程序中存在逻辑错误。对于输入:(2,4,3,1,9)我得到的输出是:(3013077,4,1,9,2)@ChaitanyaNettem-我已经更新了答案..以回答您的编辑。-我从某人的帮助中发现的另一个错误是,由于索引从0开始,l和r应该初始化为l=2*I+1和r=2*I+2。好的,这清除了分段错误,但显然我的程序中存在逻辑错误。对于输入:(2,4,3,1,9)我得到的输出是:(3013077,4,1,9,2)好的,这消除了分段错误,但显然我的程序中有一个逻辑错误。对于输入:(2,4,3,1,9)我得到的输出是:(3013077,4,1,9,2)