On Fri, Nov 20, 2020 at 07:50:54PM +0100, Eugenio Pérez wrote: > Specify VirtQueueElement * as return type makes no harm at this moment. The reason for the void * return type is that C implicitly converts void pointers to pointers of any type. The function takes a size_t sz argument so it can allocate a object of user-defined size. The idea is that the user's struct embeds a VirtQueueElement field. Changing the return type to VirtQueueElement * means that callers may need to explicitly cast to the user's struct type. It's a question of coding style but I think the void * return type communicates what is going on better than VirtQueueElement *.