为什么heapsort的这个C实现会出现分段错误?
我尝试在gcc和turboc中执行这段代码。在GCC中,它在运行时给我一个分段错误,在turbo中,它在运行时再次给我一个空指针分配错误 我试图追踪它,但我看不出问题出在哪里为什么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
#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)