Insert HeadList 와 CONTAININGRECORD
1494 단어 데이터 구조
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
함수 InitializeListHead (BUEList) 로 초기 화 합 니 다.
데이터 구 조 를 삽입 해 야 한다 고 가정 합 니 다.
strct B_U_E{
LIST_ENTRY BUELink;
...
...
} BUE;
그리고 BUE 의 인 스 턴 스 대상 을 삽입 하기 시작 합 니 다. InsertHeadList () 함 수 를 호출 합 니 다.
BUE abue = ...
InsertHeadList(&BUEList, &abue->BUELink);
이렇게 하면 삽입 동작 이 완 료 됩 니 다.
현재 LIST 에서 BUE 의 대상 데 이 터 를 읽 으 려 고 합 니 다.CONTAINING_RECORD 이 매크로.
#define CONTAININT_RECORD(address, type, field) \
((type*)((PCHAR)(address) - (PCHAR)(&((type*)0)->field)))
이 매크로 는 메모리 의 모든 구조 체 의 첫 주 소 를 가 져 오 는 데 사 용 됩 니 다. 제공 할 인 자 는 구조 체 의 한 구성원 (field) 의 주소 address, 구조 체 의 유형 type, 주 소 를 제공 하 는 그 구성원 의 이름 field 입 니 다.
그래서 만약 우리 가 첫 번 째 데 이 터 를 읽 고 싶다 면:
Link = BUEList.Flink;
while (Link != &BUEList)
{
bue= CONTAINING_RECORD(Link,BUE, BUELink);
Link = Link->Flink;
}
이렇게 하면 데이터 읽 기 작업 이 완 료 됩 니 다.
누락 된 점 이 있 는 지 모르겠다.