ListEntry类用法

时间:2014-04-07 05:52:45

标签: c winapi

  #include <windows.h>
  #include "stdafx.h"
  #include "List.h"

  typedef struct List_Node
  {
     LIST_ENTRY list;
     int val1;
  }LIST_NODE, *PLIST_NODE;

  int _tmain(int argc, _TCHAR* argv[])
  {

     int i = 0;

     PLIST_NODE pNewnode;
     pNewnode = new LIST_NODE;


     LIST_ENTRY head;

     InitializeListHead(&head);

     for (i = 0; i < 3; i++)
     {

         pNewnode = new LIST_NODE;
         pNewnode->val1 = i;
         InsertTailList(&head, &pNewnode->list);
         pNewnode = NULL;
     }

     while (!IsListEmpty(&head))
     {

         PLIST_ENTRY removeNode = RemoveHeadList(&head);

         PLIST_NODE mydatanode = (PLIST_NODE)CONTAINING_RECORD   
                                                  (removeNode,LIST_NODE,val1);

         printf("%d\n", mydatanode->val1);
     }


     return 0;
   }

使用这段代码我没有正确获取val1数据它给了我垃圾值?我做错了什么?

1 个答案:

答案 0 :(得分:2)

请阅读documentation for CONTAINING_RECORD。第三个参数描述为:

  

Field [in]

     

Address指向的字段的名称,它包含在Type类型的结构中。

我怀疑你的代码:

PLIST_ENTRY removeNode = RemoveHeadList(&head);

PLIST_NODE mydatanode = (PLIST_NODE)CONTAINING_RECORD(removeNode,LIST_NODE,val1);

不正确。这是因为CONTAINING_RECORD的第三个参数与您传入的地址的类型不同。它也不是val1有意义的。它需要做的是从LIST_NODE中包含的LIST_ENTRY地址中找出LIST_NODE的地址。

我认为使用:

PLIST_ENTRY removeNode = RemoveHeadList(&head);

PLIST_NODE mydatanode = (PLIST_NODE)CONTAINING_RECORD(removeNode,LIST_NODE,list);

应该解决你的问题。