C语言 简单分配中的分段错误



我正在用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));

相关内容

  • 没有找到相关文章

最新更新