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

时间:2017-11-21 02:56:50

标签: c heap

我正在编写一个程序,它将获取一个数组,堆积它,然后找到第k个最小的元素。从我的教科书中我可以得到很多需要的算法,但我现在卡住了,因为每当我尝试测试程序时,我都会收到分段错误。 在结构中的教科书中它的PQ_SIZE大小为q,但是我无法弄清楚为什么或如何使这个工作,所以我做了6因为我测试的是5,但每当我编译程序时请输入5作为我的第一个数字,即使它小于6,我也会收到分段错误。我只是感到困惑,对我的代码的任何建议都会非常感谢,谢谢。

2 个答案:

答案 0 :(得分:1)

main()中您传递了*heap,这是指向pq_init()的未初始化指针,您要为其成员分配值

 priority_queue* heap;
 pq_init(heap);

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

答案 1 :(得分:1)

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

编译器输出的一条警告消息是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个空行分隔功能(保持一致)