c - 为什么 heapsort 的 C 实现会出现段错误?

标签 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])
        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]);
}

注意:我使用 CLRS 中给出的堆排序算法对此进行了编码。

编辑:这是我提供的输入和我得到的错误。

chaitanya@chaitanya-laptop:~/Desktop/My prog$ ./a.out
ENTER THE SIZE OF YOUR ARRAY:5
ENTER THE ARRAY ELEMENTS:
9
5
8
7
6
Segmentation fault

编辑: 显然是 i++ 而不是 i-- 的愚蠢错误导致了这个问题。但现在似乎有一个逻辑错误,因为程序没有将排序后的数组作为输出。

ENTER THE SIZE OF YOUR ARRAY:5
ENTER THE ARRAY ELEMENTS:
2
4
3
1
9
THE SORTED ARRAY IS:3013077 4 1 9 2

最佳答案

下面的 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;

关于c - 为什么 heapsort 的 C 实现会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8192386/

相关文章:

linux - shell 错误 xargs : terminated by signal 11

algorithm - BUILD-MAX-HEAP 运行时间,用于按降序排列的数组

c++ - 如何通过引用传递指针来更改指针指向的位置?

c - OpenGL - 旋转 2D 小行星船

c - 使用 ProtoBuf 将数据流式传输到带有 header 的日志文件

c - 操作系统如何为文件执行缓冲

algorithm - Max Heapify-伪代码

c - GCC libm 不工作

c - 如果我尝试打印不在用户空间中的地址值,SIGSEGV 故障如何工作

c - 具有 void 函数的 libffi 段错误