49 votes

Pourquoi écrire `sizeof(char)` si char vaut 1 par défaut ?

Je faisais du codage C et après avoir lu du code C, j'ai remarqué qu'il y a des bouts de code comme

char *foo = (char *)malloc(sizeof(char) * someDynamicAmount);

J'aimerais donc savoir quelle est la meilleure façon, en C, d'allouer de la mémoire à un tableau de caractères ? Utiliser sizeof(char) et soi-disant protéger le code contre tout changement de norme, ou l'omettre et utiliser directement le numéro ?

65voto

AProgrammer Points 31212

La manière plus Cish serait

char* foo = malloc(someDynamicAmount * sizeof *foo);

en référençant la variable et non le type afin que le type ne soit pas nécessaire. Et sans casting du résultat de malloc (ce qui est C++ish).

29voto

RedX Points 7449

Je le fais. sizeof(char) pour que les intentions soient claires. Si quelqu'un décide un jour qu'il veut que Foo devienne un int il sait qu'il devra faire sizeof(int) pour qu'il continue à fonctionner.

ou l'omettre et utiliser le numéro

De plus, l'utilisation de chiffres magiques n'est pas une bonne pratique de codage.

25voto

Steve Fallows Points 4059

À mon avis, la meilleure pratique consiste à écrire sizeof(*foo) . Alors vous êtes couvert aussi si le type de foo change et que la taille de foo n'est pas corrigée.

11voto

Armen Tsirunyan Points 59548

Comparez :

float*baz = malloc(sizeof(float) * someDynamicAmount);
int  *bar = malloc(sizeof(int)   * someDynamicAmount);
char *foo = malloc(sizeof(char)  * someDynamicAmount);

Vs :

float*baz = malloc(sizeof(float) * someDynamicAmount);
int  *bar = malloc(sizeof(int)   * someDynamicAmount);
char *foo = malloc(someDynamicAmount);

J'aime la première version. Préférez-vous la seconde ?

7voto

Dave S Points 11381

Vous avez raison, selon la norme, la multiplication n'a pas d'importance. Cela dit, cela ressemble à une habitude que quelqu'un a prise pour être cohérent. Si vous utilisez toujours le sizeof() quel que soit le type, on n'oublie jamais.

char *foo = (char *)malloc(sizeof(char) * someDynamicAmount);
int  *bar = (int  *)malloc(sizeof(int)  * someDynamicAmount);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X