#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数据它给了我垃圾值?我做错了什么?
答案 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);
应该解决你的问题。