2010-06-25 6 views
9

Salut récemment j'ai vu beaucoup de code en ligne sur (également sur le SO;) comme:Allouer tableau de caractères en utilisant malloc

char *p = malloc(sizeof(char) * (len + 1)); 

Pourquoi sizeof (char)? Ce n'est pas nécessaire, n'est-ce pas? Ou est-ce juste une question de style? Quels sont ses avantages?

+1

Dupliquer de http://stackoverflow.com/questions/1011806/is-it-necessary-to-multiply-by-sizeof-char-when -manipulating-memory bien que je ne sois pas d'accord avec la réponse acceptée (je préfère omettre sizeof (char)) – user85509

Répondre

12

Oui, c'est une question de style, car vous vous attendez à ce que sizeof(char) en soit toujours un. D'un autre côté, utiliser sizeof(foo) lors de l'exécution d'un malloc est important et, surtout, il rend le code auto-documenté.

Aussi mieux pour la maintenance, peut-être. Si vous passez de char à wchar, vous souhaitez passer à

wchar *p = malloc(sizeof(wchar) * (len + 1)); 

sans beaucoup de réflexion. 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.

Et comme @Nyan suggère dans un commentaire, vous pouvez aussi 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 les tampons ordinaires.

+0

Alors pourquoi ne pas utiliser type * p = malloc (sizeof (* type) * (len + 1)); ;) – Nyan

+3

Oh je voulais dire sizeof (* p) – Nyan

+0

@Nyan: Bien sûr, cela fonctionne aussi. Je n'avais jamais vu ça auparavant, mais si j'étais encore un programmeur C travaillant, je considérerais adopter votre suggestion comme un idiome .. bien que la partie 'len + 1' ne serait que pour des objets ressemblant à des cordes. – brainjam

1

Permet de documenter l'opération. Le langage définit un caractère comme étant exactement un octet. Il ne spécifie pas combien de bits sont dans cet octet car certaines machines ont des unités adressables minimum de 8, 12, 16, 19 ou 30 bits (ou plus). Mais un caractère est toujours un octet.

1

La spécification stipule que les caractères sont 1 octet, c'est donc strictement facultatif. Personnellement, j'inclue toujours le sizeof à des fins de cohérence, mais cela n'a pas d'importance

Questions connexes