C 为什么我的heapify/find min程序中出现分段错误?

C 为什么我的heapify/find min程序中出现分段错误?,c,heap,C,Heap,我正在编写一个程序,它将获取一个数组,对其进行重排序,然后找到第k个最小元素。从我的教科书中,我能够得到许多需要的算法,但我现在陷入困境,因为每当我尝试测试程序时,我都会收到一个分段错误。 在struct的教科书中,它的PQ_大小是q的大小,但是我不知道为什么或者如何使它工作,所以我把它设为6,因为我一直测试的n是5,但是每当我编译程序,然后输入5作为我的第一个数字,我收到一个分段错误,即使它小于6。我只是总体上感到困惑,任何关于我的代码的建议都将不胜感激,谢谢。在main()中,您传递了*he

我正在编写一个程序,它将获取一个数组,对其进行重排序,然后找到第k个最小元素。从我的教科书中,我能够得到许多需要的算法,但我现在陷入困境,因为每当我尝试测试程序时,我都会收到一个分段错误。 在struct的教科书中,它的PQ_大小是q的大小,但是我不知道为什么或者如何使它工作,所以我把它设为6,因为我一直测试的n是5,但是每当我编译程序,然后输入5作为我的第一个数字,我收到一个分段错误,即使它小于6。我只是总体上感到困惑,任何关于我的代码的建议都将不胜感激,谢谢。

main()
中,您传递了
*heap
,它是指向
pq_init()
的未初始化指针,您在其中为其成员赋值

 priority_queue* heap;
 pq_init(heap);

这将导致未定义的行为,您需要在使用前将内存分配给

您是否实际编译了发布的代码

编译器输出的警告消息之一是
优先级队列*堆正在未初始化的情况下使用

具体来说,指针被传递到函数:
pq\u init()

函数:
pq_init()
取消引用字段
n
的指针

但是,尚未将指针:
heap
分配给应用程序所拥有的内存中的某个区域(调用
malloc()
可以解决这个问题)。实际上,指针
包含垃圾恰好位于指针所在堆栈上的位置

注意:struct
priority\u队列的定义没有
标记
名称。使用调试器单步执行程序时,缺少标记名将是一个问题

====

变量(和参数)名称应表示
内容
用法
(或两者都更好)。像
i
j
q
p
x
等名称即使在当前上下文中也毫无意义

====

代码应该遵循公理:每行只有一条语句,并且(最多)每条语句有一个变量声明

====

为便于阅读和理解:

  • 通过单个空行分隔代码块(用于、if、else、while、do…while、switch、case、default)
  • 用2或3个空行分隔功能(保持一致)

  • 所以,调试它。如果您不知道如何使用调试器,请添加一些
    printf()s
    ,这样您就可以看到哪里出了问题……据我所知,您的索引偏离了1。传统的做法是使用基于一个索引的方法来表示堆。实际实现必须使用基于零的,因为这正是C数组的工作方式。为什么要从问题中删除代码。这样做的部分原因是我们都能从别人的错误中吸取教训。现在,如果有人问这个问题,他们将看不到您的代码,并且提供的答案毫无意义。还有其他问题,但这可能是导致SEGFULT的原因。非常感谢,这实际上对我有效。抱歉,我还是个新手。非常感谢您的详细回复。