Originariamente inviato da MItaly
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.

[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).
Non ho capito, se sizeof ritorna la dimensione in bytes e sizeof(char) ritorna sempre 1, come fa a non essere 8 bit?

Per il casting, ora non posso provare ma tempo fa avevo letto qualcosa online a riguardo dove veniva detto che il cast poteva addirittura essere deleterio, nascondendo una mancata inclusione di stdlib.h, dichiarazione implicita, ritorno di default a int, conversione implicita, crash... però beh potrebbe dipendere anche dalle pignolerie di ogni versione dello standard, e soprattutto si spera che tutti compilino con un livello di warning sufficiente da rendersene conto.