gpt4 book ai didi

c - 为什么我在for循环中间无法访问Heap结构?

转载 作者:行者123 更新时间:2023-11-30 20:32:38 25 4
gpt4 key购买 nike

看那里,当i = 34时我可以访问结构堆,但是当i = 37时我丢失了它

struct heap

我正在执行Prim算法来计算c中的MST,但是我的堆给我带来了问题,当Heap->Data[Origin]大于34时,无缘无故丢失了i的访问权限。

我知道这可能是由内存使用引起的,因为它可能不会发生在较小的输入上。

    #ifndef MST_H
#define MST_H

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <stdint.h>
#include <inttypes.h>
#include <limits.h>
#include "Heap.h"
#include "Graphs.h"

void InitializePrim(int32_t *Fathers, PriorityQueue *Heap,uint32_t NumberVertex, uint32_t Origin);

void PutInTree(Graph *Graph,
int32_t *Parent,
PriorityQueue *Heap,
uint32_t Origin);

void Prim(Graph *Graph, uint32_t Origin, int32_t *Fathers);

#endif
#include "AlgorithmsMST.h"

void InitializePrim(int32_t *Parent, PriorityQueue *Heap,uint32_t NumberVertex, uint32_t Origin)
{
if (&Heap->Data[Origin] == NULL)
{
printf("There was some problem\n");
return;
}
for (int i = 1; i <= NumberVertex; ++i)
{
Parent[i] = -1;
InsertItem(Heap,i,INT_MAX);
}
Parent[Origin] = 0;
Heap->Data[Heap->Index[Origin]].Priority = 0;
PromoveElement(Heap, Heap->Index[Origin]);
}

void PutInTree(Graph *Graph,
int32_t *Parent,
PriorityQueue *Heap,
uint32_t Origin)
{
ListNode *Aux = Graph->Nodes[Origin].Head;
while (Aux != NULL)
{
if ((Heap->Data[Heap->Index[Aux->Vertex]].Priority > Aux->Weigth) && (Heap->InHeap[Aux->Vertex] == 1 ))
{
Parent[Aux->Vertex] = Origin;
Heap->Data[Heap->Index[Aux->Vertex]].Priority = Aux->Weigth;
PromoveElement(Heap,Heap->Index[Aux->Vertex]);
}
Aux = Aux->Next;
}
}

void Prim(Graph *Graph, uint32_t Origin, int32_t *Parent)
{
int i;
uint32_t Smallest;
PriorityQueue *Heap = MakeEmptyHeap(Graph->NumberVertex);
InitializePrim(Parent,Heap,Graph->NumberVertex,Origin);
for (i = 1; i <= Graph->NumberVertex; ++i)
{
Smallest = Heap->Data[0].Key;
RemoveItem(Heap);
PutInTree(Graph,Parent,Heap,Smallest);

}
DestroyHeap(Heap);
}


这是错误摘要的gdb反馈的副本。

    (gdb) p i
$9 = 31
(gdb) p Heap->Data[Origin]
$10 = {Key = 2, Priority = 2.14748365e+09}
(gdb) c
Continuing.

Breakpoint 2, Prim (Graph=0x605250, Origin=1, Parent=0x60c1d0) at AlgorithmsMST.c:45
45 Parent[i] = -1;
(gdb)
Continuing.

Breakpoint 2, Prim (Graph=0x605250, Origin=1, Parent=0x60c1d0) at AlgorithmsMST.c:45
45 Parent[i] = -1;
(gdb)
Continuing.

Breakpoint 2, Prim (Graph=0x605250, Origin=1, Parent=0x60c1d0) at AlgorithmsMST.c:45
45 Parent[i] = -1;
(gdb) p i
$11 = 34
(gdb) p Heap->Data[Origin]
$12 = {Key = 2, Priority = 2.14748365e+09}
(gdb) c
Continuing.

Breakpoint 2, Prim (Graph=0x605250, Origin=1, Parent=0x60c1d0) at AlgorithmsMST.c:45
45 Parent[i] = -1;
(gdb) p Heap->Data[Origin]
Cannot access memory at address 0x100000007
(gdb) c
Continuing.

Breakpoint 2, Prim (Graph=0x605250, Origin=1, Parent=0x60c1d0) at AlgorithmsMST.c:45
45 Parent[i] = -1;
(gdb) p i
$13 = 36
(gdb) p Heap->Data[Origin]
Cannot access memory at address 0x7
(gdb)

最佳答案

I just had forgotten an parentheses
int32_t *Parent = (int32_t*)malloc((Graph->NumberVertex+1)*sizeof(int32_t));
InitializePrim(Parent,Graph->NumberVertex,Origin);
PriorityQueue *Heap = MakeEmptyHeap((Graph->NumberVertex));

这足以解决问题。
记住,永远不要忘记,永远不要忘了痛苦。

关于c - 为什么我在for循环中间无法访问Heap结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com