#include <stdio.h>
#include <stddef.h>

// Упрощённая версия одноимённого макроса из ядра Linux. :)
#define container_of(ptr, type, member) ((type *)((char *)ptr - offsetof(type, member)))

typedef struct stack_node
{
	struct stack_node* next;
} stack_node;

typedef struct
{
	stack_node* top;
} stack;

void push(stack* stk, stack_node* item)
{
	item->next = stk->top;
	stk->top = item;
}

stack_node* pop(stack* stk)
{
	stack_node* item = stk->top;
	if (item) stk->top = item->next;
	return item;
}

typedef struct
{
	char* name;
	stack_node sn;
} my_object;

my_object* my_object_from_sn(stack_node* sn_ptr)
{
	return container_of(sn_ptr, my_object, sn);
}

int main(void) {
	my_object a = {"A"}, b = {"B"}, c = {"C"};
	stack stk = {};
	push(&stk, &a.sn);
	push(&stk, &b.sn);
	push(&stk, &c.sn);

	stack_node* popped;
	while ((popped = pop(&stk)))
		printf("Popped %s.\n", my_object_from_sn(popped)->name);
	return 0;
}