Fixed-sized memory pool in C
Only a small review

Alignment not guaranteed

temp = (size_t*) ((char*)temp + member_size); attempts to convert a char* to size_t *, yet (char*)temp + member_size is not known to be properly aligned for a size_t*.  Insufficient alignment is undefined behavior.

Detect overflow

As the true product of nmemb * member_size may exceed SIZE_MAX:

if (SIZE_MAX/nmemb &gt; member_size) {
  Handle_Overflow();  // clean-up, return NULL;
}
... =  malloc(nmemb * member_size);


Strange uses of size_t as pointer

// The last member points to NULL *temp = (size_t)NULL; implies something wrong.  If codes needs a pointer, use a pointer, not size_t.  If code needs a size, doesn't use a pointer.  Note that size_t and pointers do not necessarily covert well back and forth.  They might not be the same memory width either.

This use of size_t as a place to encode a pointer is simply broken.  Code needs a new approach.