Je viens de voir ce code:
artist = (char*)malloc(0);
et je me demandais pourquoi on ferait ça?
Selon les spécifications, malloc (0) renverra soit "un pointeur nul, soit un pointeur unique pouvant être passé avec succès à free ()".
Cela vous permet essentiellement de ne rien allouer, tout en passant la variable "artist" à un appel à free () sans souci. Pour des raisons pratiques, c'est à peu près la même chose que faire:
artist = NULL;
La norme dit:
Si l'espace ne peut pas être attribué, un pointeur null est retournés. Si la taille de l'espace requis est égal à zéro, le comportement est définie par l'implémentation: soit un pointeur null est retourné, ou le comportement est comme si la taille avait quelques valeur différente de zéro, sauf que le pointeur retourné ne doit pas être utilisé pour accéder à un objet.
Donc, malloc(0)
pourrait revenir NULL
ou un pointeur valide qui peut ne pas être déréférencés. Dans les deux cas, il est parfaitement valable pour appeler free()
.
Je ne pense pas vraiment qu' malloc(0)
a beaucoup utilisé, sauf dans les cas où l' malloc(n)
est appelée dans une boucle par exemple, et n
pourrait être de zéro.
En regardant le code dans le lien, je crois que l'auteur avait deux idées fausses:
malloc(0)
renvoie un pointeur valide toujours, etfree(0)
est mauvais.Donc, il a fait en sorte qu' artist
et d'autres variables y en avait toujours à la "validité" de la valeur en eux. Le commentaire dit: // these must always point at malloc'd data
.
malloc(0) comportement est mise en œuvre spécifique. La bibliothèque peut retourner la valeur NULL ou ont l'ordinaire malloc comportement, pas la mémoire allouée. Quoi que l'on fasse, il doit être documenté quelque part.
Généralement, elle renvoie un pointeur est valide et unique, mais ne devrait PAS être déréférencés. Notez également qu'il PEUT consommer de la mémoire, même si elle n'alloue pas réellement de quoi que ce soit.
Il est possible de realloc un non-nulle de la fonction malloc(0) pointeur.
Avoir un malloc(0) mot à mot n'est pas beaucoup d'utilisation. Il est surtout utilisé lorsqu'une allocation dynamique est de zéro octet et vous n'avez pas de soins pour la valider.
Il y a une réponse ailleurs sur cette page qui commence "malloc(0) retournera une adresse mémoire valide et dont la portée dépend du type de pointeur qui est alloué de la mémoire". Cette affirmation est incorrecte (je n'ai pas assez de réputation pour commenter la réponse directement, ne peut donc pas mettre ce commentaire directement sous).
Faire des malloc(0) pas automatiquement allouer de la mémoire de taille correcte. La fonction malloc est pas au courant de ce que vous êtes casting de son résultat. La fonction malloc s'appuie uniquement sur le nombre de taille que vous donnez comme argument. Ce que vous devez faire malloc(sizeof(int)) pour avoir suffisamment de stockage de tenir un int, par exemple, pas 0.
malloc(0)
n'a aucun sens pour moi, à moins que le code est en s'appuyant sur des comportements spécifiques à la mise en œuvre. Si le code est conçu pour être portable, il doit alors tenir compte du fait qu'un retour NULL à partir de malloc(0)
n'est pas un échec. Alors pourquoi ne pas affecter NULL à l' artist
de toute façon, puisque c'est une bonne réussite, et moins de code, et ne causera pas de vos entretien des programmeurs de prendre du temps à essayer de le comprendre?
malloc(SOME_CONSTANT_THAT_MIGHT_BE_ZERO)
ou malloc(some_variable_which_might_be_zero)
pourrait peut-être ont leurs usages, même si encore une fois, vous devez prendre soin de ne pas traiter un retour NULL comme un échec si la valeur est 0, mais 0, la taille est censé être OK.
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.