Salut récemment, j'ai vu beaucoup de code en ligne (également sur SO;) comme:
char *p = malloc( sizeof(char) * ( len + 1 ) );
Pourquoi sizeof (char)? Ce n'est pas nécessaire, non? Ou est-ce juste une question de style? Quels sont ses avantages?
Oui, c'est une question de style, car vous vous attendez à ce que sizeof(char)
en soit toujours un.
D'un autre côté, c'est vraiment un idiome d'utiliser sizeof(foo)
lorsque vous faites un malloc
, et surtout, cela rend le code auto-documenté.
Peut-être aussi mieux pour l'entretien. Si vous passiez de char
à wchar
, vous basculeriez vers
wchar *p = malloc( sizeof(wchar) * ( len + 1 ) );
sans trop réfléchir. Alors que la conversion de l'instruction char *p = malloc( len + 1 );
nécessiterait plus de réflexion. Il s'agit de réduire les frais généraux mentaux.
Et comme @Nyan le suggère dans un commentaire, vous pouvez également faire
type *p = malloc( sizeof(*p) * ( len + 1 ) );
pour les chaînes terminées par zéro et
type *p = malloc( sizeof(*p) * len ) );
pour tampons ordinaires.
Il sert à auto-documenter l'opération. Le langage définit un caractère comme étant exactement un octet. Il ne spécifie pas combien bits sont dans cet octet car certaines machines ont 8, 12, 16, 19 ou 30 unités adressables minimum (ou plus). Mais un caractère est toujours un octet.
La spécification dicte que les caractères sont à 1 octet, c'est donc strictement facultatif. Personnellement, j'inclus toujours le sizeof
à des fins de cohérence, mais cela n'a pas d'importance