C 实现基于指针的堆结构时出现分段错误11

C 实现基于指针的堆结构时出现分段错误11,c,C,我试图实现堆数据结构,但在运行以下代码时遇到了问题 我得到一份工作 line 1: 47794 Segmentation fault: 11 错误 void heap_initialize(heap* p_heap){ heap new_heap = { .size = 0, .alloc_size = 1024, .root = NULL, }; *p_heap = new_heap; } void heap_insert(heap* ad

我试图实现堆数据结构,但在运行以下代码时遇到了问题

我得到一份工作

line 1: 47794 Segmentation fault: 11 
错误

void heap_initialize(heap* p_heap){
  heap new_heap = {
    .size       = 0,
    .alloc_size = 1024,
    .root = NULL,
  };
  *p_heap = new_heap;
}

void heap_insert(heap* addr, void* p_thing, int priority) {
  heap my_heap = *addr;
  node* root   = my_heap.root;

  if (root == NULL) {
    my_heap.root = p_thing;
  }

  int i         = my_heap.size + 1;
  node new_node = {
    .thing    = p_thing,
    .priority = priority
  };

  node* new_node_addr = &new_node;

  node* child_addr = root + (i * 4);
  node child       = *new_node_addr;

  node* parent_addr = root + ((i / 2) * 4);
  node parent       = *parent_addr;

  while ( child.priority > parent.priority && root != &child ) {
    node* temp  = parent_addr;
    parent_addr = child_addr;
    child_addr  = temp;

    node child  = *child_addr;
    i           = i / 2;

    parent_addr = root + (i * 4);
    node parent = *parent_addr;
  }
主要

根据我所读到的,当试图访问你无法访问的内存时,会出现分段错误,但我无法找出原因 你知道为什么会这样吗

更新 来自lldb调试器的结果

Process 47876 stopped
* thread #1: tid = 0x82070f, 0x0000000100000e0f heap`heap_insert + 207, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x0000000100000e0f heap`heap_insert + 207
heap`heap_insert + 207:
-> 0x100000e0f:  movq   (%rcx), %rdi
   0x100000e12:  movq   %rdi, -0x88(%rbp)
   0x100000e19:  movq   0x8(%rcx), %rcx
   0x100000e1d:  movq   %rcx, -0x80(%rbp)

在调试器中运行时,它将在崩溃位置停止。如果您构建程序的调试版本,它将有所帮助。例如,在构建时添加-g标志。这将允许您查看崩溃位置的文件名和实际行号。另外,请使用命令bt检查函数调用堆栈。如果root==NULL{…}没有为root赋值,则稍后*parent\u addr尝试从该NULL地址读取。此外,在循环中有以下语句:node parent=*parent\u addr;。它声明了一个新的父结构,唯一的生命周期是循环结束的下一行。你确定要声明一个新的父变量吗?@Tarlen:没错,你指定给我的堆.root,而不是普通根。
Process 47876 stopped
* thread #1: tid = 0x82070f, 0x0000000100000e0f heap`heap_insert + 207, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x0000000100000e0f heap`heap_insert + 207
heap`heap_insert + 207:
-> 0x100000e0f:  movq   (%rcx), %rdi
   0x100000e12:  movq   %rdi, -0x88(%rbp)
   0x100000e19:  movq   0x8(%rcx), %rcx
   0x100000e1d:  movq   %rcx, -0x80(%rbp)