En fait, je m'attendais à un avertissement / une erreur ici, mais il compile sans aucun problème. Pourquoi est-il possible d'appeler une fonction de calloc avec 0 objets comme premier argument? Et pourquoi alloue-t-il de la mémoire pour cela? OK, quelques ajouts: P> void* calloc( size_t num, size_t size );
Allocates memory for an array of num objects of size and initializes all bytes in the
allocated storage to zero.
If allocation succeeds, returns a pointer to the lowest (first) byte in the allocated
memory block that is suitably aligned for any object type.
If size is zero, the behavior is implementation defined (null pointer may be returned,
or some non-null pointer may be returned that may not be used to access storage)
3 Réponses :
MALLOC de taille zéro, calloc est 100% ok.
Vous pouvez attribuer n'importe quelle valeur au libres code> est ok p>
Tailleof code> du p_integer code> ou * p_integer code> n'utilise pas la déséroférance du pointeur - il est 100% ok p>
p_integer code> - mais si MALLOC ou CALLOC renvoie valide NON POINTER NULL, il entraînera la fuite de mémoire potentielle; P>
Pourquoi est-il possible d'appeler une fonction de calloc avec 0 objets comme premier argument? (Op) p>
Il est possible car la spécification C pour la bibliothèque dit qu'il est autorisé. Pourtant, les allocations de mémoire de 0 sont un cas de bord qui aboutit à comportement défini sur la mise en œuvre em>. P>
C17 / 18 a été récemment mis à jour dans cette zone pour: P>
Si la taille de l'espace demandé est zéro, le comportement est défini par la mise en oeuvre: un pointeur NULL est renvoyé pour indiquer une erreur ou le comportement est comme si la taille était une valeur non nulle, sauf que le pointeur renvoyé doit ne pas être utilisé pour accéder à un objet. C17DR § 7.22.3 1 P> blockQuote>
Et pourquoi alloue-t-il la mémoire pour cela? (Op) p> BlockQuote>
Il n'y a aucune preuve que toute mémoire a été allouée, juste qu'un pointeur NULL code> NULL code> a été renvoyé pour OP. Il ne peut pas être utilisé pour faire référence à une mémoire. P>
Dois-je calculer 0 * Tailleof (int) == 0 (taille du bloc de mémoire requis). Quelle "taille" signifie-t-il? P> blockQuote>
La "taille" est le produit (sans
Taille_t code> limitation de la plage). La taille d'un objet n'est jamais 0 y comprisTailleof (int) code>, alors seul le testn code> doit tester. Aveccalloc (n, sz) code>, où les deux sont des variables, je testerais avecsi (n == 0 || sz == 0) code> plutôt que d'effectuer une multiplication qui apporte Dans les problèmes de débordement. p>
Pour éviter ce comportement défini de la mise en œuvre, des arguments de test en premier. Exemple: p>
xxx pré> alternativement, pour tenir compte du comportement défini de la mise en œuvre, peut-être pas d'erreur sur
calloc (0, taille de * p) code> retournernull code>. p>xxx pré> blockQuote>
[Cette réponse s'adresse à la raison pour laquelle nous voudrions envisager d'écrire un programme qui examine certaines contributions et catégorise peut-être diverses choses, rendant les listes de données dans la catégorie C1, C2, etc. Plus tard, le logiciel traitera toutes les données de C1, puis toutes les données de C2, etc. P>
considère que ce qui est plus simple et plus court: p>
L'ancien choix est plus simple, plus court et plus propre. Généralement, il offre moins de possibilités de bugs. Lorsque le logiciel doit avoir des chemins différents en fonction de la question de savoir si n em> est zéro ou positif, il y a une chance qu'un programmeur pourrait négliger le boîtier zéro, ce qui entraîne un bug. P> calloc code> et malloc code> pour fournir zéro octets de mémoire lorsque demandé. Il ne traite pas de ce que la norme C indique à ce sujet.] P>
Étant donné que
p_integer code> est de typeint * code>,Tailleof (* p_integer) code> est identique à celuiTailleof (int) code>. Réglagep_integer = null; code> ne change pas la taille i> dep_integer code>.MALLOC (0) CODE> ouCALLOC (0, ...); code> peut renvoyer un "code> null code> pointeur ou un pointeur non nul. Dans les deux cas: aucune mémoire ne peut être utilisée etfree () code> sur le pointeur renvoyé est une opération valide.Donc, le programme doit quitter après p_integer = null; ? Mais ça ne le fait pas.
Le compilateur n'est pas tenu de délivrer un avertissement pour cela. Et cela peut être intéressant de lire: Stackoverflow.com/questions/1073157/zero-size-malloc
Donc, le programme doit quitter après p_integer = null i>: sa mise en œuvre dépendante.
Cela peut renvoyer un pointeur non nul. Était-ce null?
Je pensais que la taille n'est pas nulle. Mais c'est zéro. Parce que la taille sera calculée comme 0 * Tailleof (int)! ;-)
La section Notes B> de la page CPPreference.com i> semble expliquer pourquoi nous l'avons.