#include #include #include #define MAGIC 0xAEAEAEAE typedef int (*adder)(int); int adderGeneric(int x) { int data = MAGIC; return data + x; } void endOfAdderGeneric() {} adder createAdder(int data) { char *start = (char *)adderGeneric; char *end = (char *)endOfAdderGeneric; char *result = (char *)malloc(end - start); memcpy(result, start, end - start); char *p; for (p = result; ; ++p) { int *q = (int *)p; if (*q == MAGIC) { *q = data; break; } } return (adder)result; } void deleteAdder(adder a) { char *m = (char *)a; free(m); } int main() { adder add3 = createAdder(3); adder add5 = createAdder(5); printf("%d %d\n", add3(10), add5(10)); deleteAdder(add3); deleteAdder(add5); return 0; }