Quelle est la meilleure pratique pour malloc?

Lesquels des éléments suivants sont corrects et seraient considérés comme la meilleure pratique pour créer une chaîne de caractères pouvant contenir 100 caractères?

char * charSsortingngA = malloc(100); char * charSsortingngB = malloc(sizeof(char)*100); char * charSsortingngC = (char*)malloc(100); char * charSsortingngD = (char*)malloc(sizeof(char)*100); 

 char * charSsortingngA = malloc(100); char * charSsortingngB = malloc(sizeof(char)*100); 

Les deux sont également corrects.
Les deux points importants à prendre en compte dans cette évaluation sont les suivants:

  1. la taille du caractère est garantie à un octet par la norme C.
  2. Un pointeur void peut être affecté à n’importe quel pointeur sans conversion explicite en C et la conversion n’est pas nécessaire. Lancer la valeur de retour de malloc est considéré comme une mauvaise pratique pour les raisons suivantes:

Quel est le problème avec la valeur de retour de casting malloc?


La réponse ci-dessus s’applique aux options mentionnées dans le PO. Une meilleure pratique consiste à utiliser sizeof sans émettre d’hypothèse sur la taille d’aucun type . C’est la raison et le but que sizeof existe. Dans ce cas, la meilleure pratique consiste à utiliser:

 char * charSsortingngB = malloc(sizeof(*charSsortingngB)*100); 

Notez que *charSsortingngB est identique à char mais cela vous donne la *charSsortingngB de changer le type à l’avenir, il y *charSsortingngB moins d’emplacements où vous devrez vous rappeler pour effectuer des modifications.

La forme la plus générale est:

 #include  typedef struct { int a; char b[55]; } Thing; Thing *p; p = malloc (100 * sizeof *p); 

Cela fonctionne indépendamment de la définition actuelle de Thing , donc si vous voulez “réutiliser” la ligne comme

 Typedef { float water; int fire; } OtherThing; OtherThing *p; p = malloc (100 * sizeof *p); 

il fonctionnerait toujours comme prévu.

Le cas initial donnerait:

 char *p; p = malloc (100 * sizeof *p); 

, où la sizeof *p serait bien sûr superflue (puisque sizeof(char) == 1 par définition), mais cela ne fera pas de mal.

BTW: cette réponse est principalement sur le style. Syntaxiquement, toutes les variantes sont acceptables, étant donné que vous incluez stdlib.h (ou introduisez manuellement un prototype pour malloc ())

Le premier, puisque char est toujours un octet, la dissortingbution de malloc n’est nécessaire que dans c ++