1) Quello è un cast esplicito. In C non è strettamente necessario (dato che void * ha una conversione implicita a qualunque tipo di puntatore), in C++ invece se non lo metti è un errore (non è un cast implicito ammesso, in linea con una maggiore type safety). In C in fin dei conti quindi è questione di stile - chi non lo mette ti dirà che non è necessario ed è inutilmente verboso, chi lo mette in genere pensa che in ogni caso stai facendo una conversione tra tipi incompatibili, metterlo non costa nulla e ti evita di doverlo aggiungere in seguito se poi ricicli quel codice in un progetto C++.

2) "Quel che vedo" non è un buon metodo per verificare la portabilità del codice, dato il C viene usato anche su tante piattaforme "strane" (dai microcontrollori ai supercomputer passando per i DSP), dove tante assunzioni date per scontate sui PC "normali" possono non essere valide; inoltre, una sperimentazione immediata va bene (anzi, è fondamentale) per farsi una prima idea, ma bisogna stare attenti sulle questioni di portabilità. Il rischio è sempre di cadere nei classici casi di undefined behavior senza saperlo; tra l'altro spesso l'UB in casi "strani" è sfruttato dall'ottimizzatore per generare codice veloce, per cui con certi idiomi solo apparentemente ben definiti ci si ritrova dei bug solo nelle build di release. A tal proposito ti consiglio vivamente di leggere i post di questa serie, in particolare il secondo.

Ciò detto, sizeof(char) è 1 dovunque, indipendentemente da quanto possa effettivamente essere grande un char a livello di bit, per il semplice fatto che sizeof riporta le dimensioni dei tipi usando il char come unità di misura.
The sizeof operator yields the size (in bytes) of its operand [...]
When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
[C99, §6.5.3.4, ¶2,3]

Su alcune piattaforme si può piuttosto non avere un char di 8 bit (ad esempio alcuni DSP); l'informazione sulle dimensioni del char in bit comunque sta nella macro CHAR_BIT (di <limits.h>).

Ovviamente, invece, nell'allocare array di qualunque altro tipo non bisogna dimenticarsi assolutamente il sizeof(tipo).