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).