看那里,我在i = 34
时可以访问结构堆,但是当i = 37
丢失了它时
我正在使用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)
答案 0 :(得分:0)
$ ruby -w topc.rb
a
HUH?! SPEAK UP, SONNY!
A
NO, NOT SINCE 1931!
BYE
HUH?! SPEAK UP, SONNY!
BYE
HUH?! SPEAK UP, SONNY!
BYEE
NO, NOT SINCE 1939!
BYE
HUH?! SPEAK UP, SONNY!
BYE
HUH?! SPEAK UP, SONNY!
BYE
HUH?! SPEAK UP, SONNY!
Goodbye for now
这是为了解决这个问题。
记住,永远不要忘记父母。