【问题标题】:Segmentation Fault in simple assignment简单分配中的分段错误
【发布时间】:2016-05-31 11:43:17
【问题描述】:

我正在用 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 的简单分配如何会引发分段错误。

【问题讨论】:

  • 我们真的需要一个规范的副本来表示“我尝试通过未初始化的指针存储东西”。如果我们能立即关闭这些常见问题解答,那就太好了。我会考虑制作一些社区维基。
  • 帮自己和大家一个忙:总是gcc -Wall -Werror编译。
  • 哇...感谢您的提醒,但没必要成为那个严厉的伙伴。抱歉,如果这个问题毁了社区,我只是认为 SO 是一个论坛,人们来到论坛主要是因为问题。 ://
  • 哎哟。 -5 真的合理吗?请不要以显而易见的理由投反对票。这个问题提出的很清楚,也很好。加一。

标签: c pointers segmentation-fault priority-queue


【解决方案1】:

让我感到困惑的是,int 的简单分配如何引发分段错误。

好吧,在那之前看看!!!

在您的Initialize() 函数中,当您尝试访问PQ 时,它没有分配一个有效 内存。在取消引用之前,您需要为 PQ 分配适当的内存。否则,尝试访问无效内存会调用 undefined behavior

【讨论】:

  • 是的,就是这样。我非常抱歉问这样一个新手问题,但我现在被这个分段错误困住了大约一个小时。无论如何,祝你好运。
  • @Drunky,如果这对您有帮助,请按下按钮并接受答案。并且考虑在段错误上停留一小时是很短的时间。
【解决方案2】:

声明:

PriorityQueue* PQ;

声明一个变量(它的类型和名称,以及间接地它在内存中的位置)但初始化它。因此,当您使用

传递值时
Initialize(PQ);

被调用的函数使用一个随机值作为内存地址——赋值

PQ->Count=0;

将零放入任意内存位置,为您高兴地放入无效/禁止位置。

【讨论】:

    【解决方案3】:

    改为写PriorityQueue PQ;(即删除指针类型),并在main 中的所有其他实例中使用&PQ。在这种情况下,对优先级队列使用自动变量就足够了。

    否则您需要分配内存(使用malloc 等),将该内存的位置分配给PQ,并记得在完成后调用free

    【讨论】:

      【解决方案4】:

      PriorityQueue 变量 PQ 没有为其分配任何内存空间,分段错误的原因是您试图将变量存储在未分配的空间(或您无权访问的内存位置)中。要为变量 PQ 获取内存空间,请使用 malloc() 函数。

      PQ = (PriorityQueue*) malloc(sizeof(PriorityQueue));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2022-01-07
        • 1970-01-01
        相关资源
        最近更新 更多