为什么我在 heapify/find 分钟程序中收到分段错误?

Why am I recieving a segmentation fault in my heapify/find min program?

我正在编写一个程序,它将获取一个数组,对其进行堆化,然后找到第 k 个最小的元素。从我的教科书中,我能够得到很多需要的算法,但我现在被卡住了,因为每当我试图测试程序时,我都会收到一个分段错误。 在结构的教科书中,它有 PQ_SIZE 作为 q 的大小,但我不知道为什么或如何使它起作用,所以我把它设为 6,因为我一直在测试的 n 是 5,但是每当我编译程序然后输入 5 作为我的第一个数字,我收到一个分段错误,即使它小于 6。我只是一般的困惑,任何关于我的代码的建议都将不胜感激,谢谢。

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

 priority_queue* heap;
 pq_init(heap);

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

你真的编译过发布的代码吗?

编译器输出的警告消息之一是 priority_queue *heap; 未初始化使用。

具体来说,指针传递给函数:pq_init().

函数:pq_init() 解除对字段 n.

的指针的引用

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

注意:结构 priority_queue 的定义没有 tag 名称。使用调试器单步执行程序时,缺少标记名称将是一个问题。

====

变量(和参数)名称应指示 contentusage(或更好,两者)。 ijqpx 等名称毫无意义,即使在当前上下文中,

====

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

====

为了便于阅读和理解:

  1. 通过单个空行分隔代码块(for、if、else、while、do...while、switch、case、default)。
  2. 用 2 或 3 个空行分隔函数(保持一致)