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)