#include "stdio.h" struct list_head{ struct list_head *prev, *next; }; #define INIT_LIST_HEAD(ptr) do { / (ptr)->next = (ptr); (ptr)->prev = (ptr); / } while (0) #define LIST_HEAD_INIT(name) {&(name), &(name)} #define LIST_HEAD(name)/ struct list_head name = LIST_HEAD_INIT(name) void init_list_head(struct list_head *list) { list->prev = list; list->next = list; } /* *Insert a new entry between two known consecutive entries */ void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next) { next->prev = new; new->next = next; prev->next = new; new->prev = prev; } /* * list_add_tail - add a new entry * @new : new entry to be added * @head : list head to add it before * * Insert a new entry before specified head * This is useful for implementing queues. */ void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } /* * list_head - add a new entry * @new: new entry to be added * @head: list head to add after it * * Insert a new entry after a specified head * This is good for implementing stacks */ void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } /* * list_entry - get the struct for this entry * &ptr : the &struct list_head pointer * &type : the type of struct this embeded in * member : the name of the list struct within the struct */ #define list_entry(ptr, type, member) / container_of(ptr, type, member) /* * @ptr : 指向list_head数据结构的指针, * @type : 容器数据结构的类型, * @member : list_head在type中的名字 */ #define container_of(ptr, type, member) ((type *)((char *)GET_ADDR(ptr) - offset(type, member))) #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define GET_ADDR(var) (&(var)) #define HARVIS 0 struct student{ struct list_head *go; char *name; int age; }; main() { struct list_head *p; struct student stu[10]; int i; char *str = "Harvis"; for (i = 0; i < 9; i++) { stu[i].go->next = stu[i+1].go; stu[i].age = i; } stu[i].age = i; stu[0].name = str; /* p = &stu[1].go;*/ p = (struct list_head *)GET_ADDR(stu[9].go); printf("stu[0].name = %s/n", ((struct student *)((char *)str - offsetof(struct student, age)))->name); printf("stu[0].age = %d/n", ((struct student *)p)->age); printf("stu[0].age = %d/n", ((struct student *)(GET_ADDR(stu[0].go)))->age); printf("stu[0].age = %d/n", stu[0].age); printf("stu[9].age = %d/n", ((struct student *)((char *)GET_ADDR(stu[9].go)) - offsetof(struct student, go))->age); printf("stu[9].age = %d/n", ((struct student *)((char *)GET_ADDR(*p)) - offsetof(struct student, go))->age); /* #define container_of(ptr, type, member) ((type *)((char *)GET_ADDR(ptr) - offset(type, member)))*/ #if HARVIS == 0 printf("stu[1].age = %d/n", (container_of(stu[9].go, struct student, go))->age);/* 此语句总是错,请问为什么 */ #endif printf("offset go = %d", offsetof(struct student, go)); printf("%d/n", offsetof(struct student, go)); printf("%d/n", offsetof(struct student, age)); /* init_list_head(p); if (p->prev == p->next){ printf("%d/n", offsetof(struct student, go)); printf("%d/n", offsetof(struct student, name)); printf("%d/n", offsetof(struct student, age)); } ps = container_of(&me.age, struct student, age); printf("%s /n %d/n", ps->name, ps->age); */ } printf("stu[1].age = %d/n", (container_of(stu[9].go, struct student, go))->age);/* 此语句总是错,请问为什么 */