why does the
ConvertIDToName prototype say "void * id" instead of "struct ID_t *" madness!!!
That's probably where your warning is. Don't use void * explicitly generally.
Is it really worth malloc'ing 30 bytes?
just declare a char array[30]
I don't see why 30 bytes? I mean you have GB of RAM are you saving it all for Christmas?
Will 30 bytes always be enough? 1024 may be enough if times change.
Give yourself some room for possible growth. And use powers of two, 64. 128, 256, 1024 etc.