Em primeiro lugar
header_t*
é um apontador para o tipo header_t
.
Resposta
Os apontadores para o tipo void void*
são apontadores para qualquer tipo. São utilizados quando o programador não sabe qual o tipo de informação que este vai receber. Isto é, se é um int
, char
...
Como tal estes podem ser convertidos para qualquer tipo de apontador.
int i = 5;
void *p = &i;
*p = 4;//Valor de i agora é 4
Porquê o cast (header_t *) ??
Por razão nenhuma. Pelos menos em C é possivel fazer cast de void*
para qualquer tipo de apontador, não acrescentando nenhuma informação necessára ao programador(até dificulta a legibilidade do código), mas em C++ é obrigatório o cast.
Exemplo de retorno tipo void*
malloc
o seu retorno é void*
porque o programador pode definir o que tamanho que desejar, sendo assim não fazia sentido ela possuir um tipo com tamanho definido.
Problema do cast de funções que retornam void*
Se te esqueceres de incluir o header file stdlib.h
e chamares a função malloc
terás problemas pois em C o tipo padrão é int
sendo assim seria considerado int malloc()
e o cast apenas esconderia o warning dependendo do compilador.