#include #include #include #include struct Node { struct Node* next; }; struct Person { char name[1024]; struct Node link; }; struct Node* head = NULL; struct Node* iter = NULL; struct Person* tmp = NULL; void add_person(const char* nm) { tmp = malloc(sizeof(struct Person)); strcpy(tmp->name, nm); iter->next = &tmp->link; iter = iter->next; } int main(int argc, char** argv) { tmp = malloc(sizeof(struct Person)); strcpy(tmp->name, "Adam"); head = &tmp->link; iter = head; add_person("Ben"); add_person("Charlie"); add_person("Dan"); add_person("Erik"); iter->next = NULL; iter = head; while (iter) { // find the address of the object that the link is part of unsigned int link = (unsigned int)iter; size_t offset = offsetof(struct Person, link); struct Person* p = (struct Person*)(link - offset); fprintf(stdout, "%s\n", p->name); iter = iter->next; free (p); } return 0; }