La malloc (se correttamente prototipata) ritorna void* ,in C, la conversione void* <-> T* è implicita (in tutti e due i versi) ,in C++ invece non lo è ed in quel caso il cast è necessario.