我正在用C语言创建一个优先级队列结构。
结构:
#define MAXCOUNT 10
typedef int array[MAXCOUNT+1];
typedef struct {
int Count;
array items;
} PriorityQueue;
初始化函数:
void Initialize(PriorityQueue *PQ)
{
PQ->Count=0;
}
主要:
int main (void) {
PriorityQueue* PQ;
Initialize(PQ);
Insert(2, PQ);
Insert(3, PQ);
Insert(5, PQ);
Insert(1, PQ);
Insert(12, PQ);
Insert(6, PQ);
Insert(10, PQ);
printPQ(PQ);
return 0;
}
问题是,当我运行它时,我遇到了分段错误。使用 gdb,我发现它是在初始化函数上抛出的。令我感到困惑的是,一个简单的int
分配如何引发分段错误。
令我感到困惑的是,一个简单的
int
分配如何引发分段错误。
好吧,看看之前!!
在 Initialize()
函数中,当您尝试访问 PQ
时,不会为其分配有效的内存。在取消引用之前,您需要为PQ
分配适当的内存。否则,尝试访问无效内存会调用未定义的行为。
声明:
PriorityQueue* PQ;
声明一个变量(它的类型和名称,以及间接它在内存中的位置),但不初始化它。因此,当您传递值时
Initialize(PQ);
被调用的函数使用随机值作为内存的地址 - 赋值
PQ->Count=0;
将零放入任意内存位置,很高兴为您进入无效/禁止的位置。
写PriorityQueue PQ;
(即删除指针类型),并在main
的每隔一个实例中使用&PQ
。在这种情况下,对优先级队列使用自动变量就足够了。
否则,您需要分配内存(使用malloc
&c.),将该内存的位置分配给PQ
,并记住在完成后调用free
。
PriorityQueue 变量 PQ 没有为其分配任何内存空间,分段错误的原因是您尝试将变量存储在未分配的空间(或您无权访问的内存位置)中。要获取变量 PQ 的内存空间,请使用 malloc() 函数。
PQ = (PriorityQueue*) malloc(sizeof(PriorityQueue));