我怎样才能摆脱VC中的0xFEEFEE

时间:2010-03-14 22:28:19

标签: c visual-c++

我在VC ++ 2008中为C语言编程。我模拟了用于图形实现的adjList。我可以在两个顶点之间添加边缘并打印图形。 我想删除两个顶点之间的边缘并再次打印图形。无论我做什么,我都无法删除边缘后打印图形。我得到0xfeefee :(这是什么?我怎么能解决这个程序。

我的删除功能和打印图形功能如下图所示。

  void deleteEdge(Graph G, Vertex V, Vertex W)
{ 
 Edge list,prev,temp;
 list=V->list;  
  prev=NULL;
  // 
  while(list!=NULL && list->to->value!=W->value){
   prev=list;
   list=list->next;
  }
  // have found the element.
  if(list!=NULL){
   temp=list;
   // if first element of list is deleted.
   if(prev==NULL)
   list=list->next;
   else
   prev->next=list->next;

   // reallocate.
   free(temp);

  }
}




    void GRAPHprint(Graph G)
    {
     Vertex tmp;
     Edge list;
     for(tmp = G->head;tmp!=NULL;tmp=tmp->next)
     {
      fprintf(stdout,"V:%d\t",tmp->value);
      list=tmp->list;
      while(list!=NULL)
      {

       fprintf(stdout,"%d\t",list->to->value);
       list=list->next; 

      }
      fprintf(stdout, "\n");
     }
     system("pause");
    }

2 个答案:

答案 0 :(得分:4)

在您的代码中,如果您匹配并因此尝试删除列表的第一个边缘,那么您将最终取消引用已释放的指针。

list=list->next应为V->list=list->next,否则您实际上只更新本地列表(list)而不是输入列表(V->list)。

0xfeeefeee表示您正在读取堆上已删除的内存,即您正在取消引用之前已调用free的指针。这只发生在调试模式下,它打算帮助你解决这类问题!有关此幻数(和其他)的更多信息,请参阅此wikipedia entry

答案 1 :(得分:1)

当你删除的边是V->list中的第一个元素时,这个V->list指针将一直指向释放的元素。

prev==NULL案例正在尝试处理此问题,但您只是将临时本地list指针前进到下一个元素。您应该更改V->list以调整主数据结构。