Simple memory pool using no extra memory
I see a few things that might be changed.  

mp_init

First, consider checking the passed *mp variable to see if it's NULL at least within the mp_init call.  Alternatively, you could also allocate that structure within the mp_init routine and return a pointer to it or NULL on error.

The initialization is more complex than it needs to be. Rather than make repeated calls to mp_release and do all of that pointer manipulation, you could use this:

char *ptr;
for (ptr = mp-&gt;memory; --slots; ptr+=size) 
    *(void **)ptr = ptr+size;
*(void **)ptr = NULL;
mp-&gt;head = mp-&gt;memory;


mp_release

Within mp_release, there is no error checking.  This might be OK if we're looking for extreme performance, but it might be nice to have at least a debug version that checks that mem actually points to a slot.  For that to work, of course, you'll have to add at least one more variable to the structure to contain the size parameter.

mp_destroy

In mp_destroy it might be prudent to set mp-&gt;head = NULL so that any subsequent mp_get attempts will fail.