web-dev-qa-db-fra.com

Allocation d'un tableau de caractères à l'aide de malloc

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?

16
Nyan

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.

19
brainjam

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.

2
Amardeep AC9MF

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

1
Michael Mrozek