En C, est-ce que malloc (256) et malloc (sizeof (char) * 256) sont équivalents?

Je vois que les gens écrivent souvent du code C tel que:

char *ptr = malloc(sizeof(char)*256); 

Est-ce vraiment nécessaire? La norme dit que sizeof(char)==1 par définition, cela n’a donc aucun sens de simplement écrire:

 char *ptr = malloc(256); 

Merci, Boda Cydo.

Oui, C définit sizeof(char) comme étant 1, toujours (tout comme C ++).

Néanmoins, en règle générale, je conseillerais quelque chose comme:

 char *ptr = malloc(256 * sizeof(*ptr)); 

Ainsi, lorsque votre patron dit quelque chose du genre: “Oh, BTW, nous venons de recevoir une commande de la Chine. Nous devons donc gérer les trois alphabets chinois le plus rapidement possible”, vous pouvez le modifier en:

 wchar_t *ptr // ... 

et le rest peut restr le même. Étant donné que vous allez avoir environ 10 millions de maux de tête en essayant de gérer correctement même à mi-parcours raisonnablement, en éliminer quelques-uns en vaut la peine. Bien entendu, cela suppose le cas habituel où vos caractères sont vraiment destinés à contenir des caractères – s’il s’agit simplement d’un tampon brut, et que vous voulez réellement disposer de 256 octets de stockage, quel que soit le nombre de caractères (ou peut-être, vous devriez probablement vous en tenir au malloc(256) et en finir.

La question ne devrait même pas exister. Vous devriez adopter un langage plus élégant en écrivant vos malloc comme

 ptr = malloc(N * sizeof *ptr) 

Autrement dit, évitez de mentionner le nom du type autant que possible. Les noms de types sont pour des déclarations, pas pour des déclarations.

De cette façon, votre malloc sera toujours indépendant du type et aura l’air homogène. Le fait que la multiplication par 1 soit superflue sera moins évident (certaines personnes trouvent que la multiplication par sizeof(char) gênante).

Ils sont équivalents, mais il est bon de restr cohérent. Cela le rend également plus explicite, de sorte que vous comprenez bien ce que vous voulez dire. Si le type change, il est plus facile de savoir quel code doit être mis à jour.

C’est peut-être vrai, mais ce n’est vrai que pour ce cas spécifique de char .

Personnellement, j’estime qu’il est judicieux d’utiliser le formulaire malloc(sizeof(char) * 256) , car une personne qui modifie le type ou qui copie le code dans un but similaire avec un type différent risque de manquer les subtilités de ce cas.

Bien qu’il n’y ait rien de mal techniquement à écrire sizeof(char) , cela suggère que l’auteur n’est pas familier avec C et le fait que sizeof(char) est défini à 1. Dans certains projets sur lesquels j’ai travaillé, nous avons en fait recours à grep pour des exemples de sizeof(char) pour indiquer que le code pourrait être de mauvaise qualité.

D’autre part, ptr = malloc(count * sizeof(*ptr)); est une documentation très utile et un idiome d’évitement des bogues, et elle a du sens même si sizeof(*ptr) vaut 1. Cependant, elle doit être précédée de if (count > SIZE_MAX/sizeof(*ptr)) { /* handle overflow */ } ou vous avez un bug sérieux. Cela peut être particulièrement utile lors de l’allocation de tableaux de wchar_t ou de structures complexes de même longueur qu’une chaîne d’entrée, par exemple lors de la conversion d’une chaîne UTF-8 en chaîne wchar_t ou de la création d’un DFA correspondant à la chaîne.

Oui, ils sont techniquement équivalents. C’est juste une question de style – utiliser sizeof pour chaque allocation vous évite de le manquer quand vous en avez vraiment besoin.