#include #include struct ScopeCount { int count; int is_alias; void *item; }; struct ScopeCount scope_count(void *item) { struct ScopeCount sc; sc.count = 0; sc.is_alias = 0; sc.item = item; return sc; } void end_scope(struct ScopeCount *sc) { if (sc->count == 0) { free(sc->item); } sc->count--; } struct ScopeCount do_something() { struct ScopeCount sc = scope_count((void *)malloc(sizeof(int))); *(int *)sc.item = 67; sc.count = 1; end_scope(&sc); return sc; } int main() { struct ScopeCount sc = do_something(); printf("value: %d\n", *(int *)sc.item); end_scope(&sc); printf("value: %d\n", *(int *)sc.item); return 0; }