C 为什么我的heapify/find min程序中出现分段错误?
我正在编写一个程序,它将获取一个数组,对其进行重排序,然后找到第k个最小元素。从我的教科书中,我能够得到许多需要的算法,但我现在陷入困境,因为每当我尝试测试程序时,我都会收到一个分段错误。 在struct的教科书中,它的PQ_大小是q的大小,但是我不知道为什么或者如何使它工作,所以我把它设为6,因为我一直测试的n是5,但是每当我编译程序,然后输入5作为我的第一个数字,我收到一个分段错误,即使它小于6。我只是总体上感到困惑,任何关于我的代码的建议都将不胜感激,谢谢。在C 为什么我的heapify/find min程序中出现分段错误?,c,heap,C,Heap,我正在编写一个程序,它将获取一个数组,对其进行重排序,然后找到第k个最小元素。从我的教科书中,我能够得到许多需要的算法,但我现在陷入困境,因为每当我尝试测试程序时,我都会收到一个分段错误。 在struct的教科书中,它的PQ_大小是q的大小,但是我不知道为什么或者如何使它工作,所以我把它设为6,因为我一直测试的n是5,但是每当我编译程序,然后输入5作为我的第一个数字,我收到一个分段错误,即使它小于6。我只是总体上感到困惑,任何关于我的代码的建议都将不胜感激,谢谢。在main()中,您传递了*he
main()
中,您传递了*heap
,它是指向pq_init()
的未初始化指针,您在其中为其成员赋值
priority_queue* heap;
pq_init(heap);
这将导致未定义的行为,您需要在使用前将内存分配给
堆
您是否实际编译了发布的代码
编译器输出的警告消息之一是优先级队列*堆代码>正在未初始化的情况下使用
具体来说,指针被传递到函数:pq\u init()
函数:pq_init()
取消引用字段n
的指针
但是,尚未将指针:heap
分配给应用程序所拥有的内存中的某个区域(调用malloc()
可以解决这个问题)。实际上,指针堆包含垃圾恰好位于指针所在堆栈上的位置
注意:structpriority\u队列的定义没有标记
名称。使用调试器单步执行程序时,缺少标记名将是一个问题
====
变量(和参数)名称应表示内容
或用法
(或两者都更好)。像i
、j
、q
、p
、x
等名称即使在当前上下文中也毫无意义
====
代码应该遵循公理:每行只有一条语句,并且(最多)每条语句有一个变量声明
====
为便于阅读和理解:
通过单个空行分隔代码块(用于、if、else、while、do…while、switch、case、default)
用2或3个空行分隔功能(保持一致)
所以,调试它。如果您不知道如何使用调试器,请添加一些printf()s
,这样您就可以看到哪里出了问题……据我所知,您的索引偏离了1。传统的做法是使用基于一个索引的方法来表示堆。实际实现必须使用基于零的,因为这正是C数组的工作方式。为什么要从问题中删除代码。这样做的部分原因是我们都能从别人的错误中吸取教训。现在,如果有人问这个问题,他们将看不到您的代码,并且提供的答案毫无意义。还有其他问题,但这可能是导致SEGFULT的原因。非常感谢,这实际上对我有效。抱歉,我还是个新手。非常感谢您的详细回复。