-1
votes

Allocation de mémoire pour 0 éléments avec calloc ()?

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? XXX PRE>

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) 

c

8 commentaires

Étant donné que p_integer est de type int * , Tailleof (* p_integer) est identique à celui Tailleof (int) . Réglage p_integer = null; ne change pas la taille de p_integer .


MALLOC (0) ou CALLOC (0, ...); peut renvoyer un "code> null pointeur ou un pointeur non nul. Dans les deux cas: aucune mémoire ne peut être utilisée et free () 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 : 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 de la page CPPreference.com semble expliquer pourquoi nous l'avons.


3 Réponses :


0
votes

MALLOC de taille zéro, calloc est 100% ok. libres est ok

Tailleof du p_integer ou * p_integer n'utilise pas la déséroférance du pointeur - il est 100% ok

Vous pouvez attribuer n'importe quelle valeur au p_integer - mais si MALLOC ou CALLOC renvoie valide NON POINTER NULL, il entraînera la fuite de mémoire potentielle;


0 commentaires

1
votes

Pourquoi est-il possible d'appeler une fonction de calloc avec 0 objets comme premier argument? (Op)

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 .

C17 / 18 a été récemment mis à jour dans cette zone pour:

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


Et pourquoi alloue-t-il la mémoire pour cela? (Op)

Il n'y a aucune preuve que toute mémoire a été allouée, juste qu'un pointeur NULL NULL a été renvoyé pour OP. Il ne peut pas être utilisé pour faire référence à une mémoire.

Dois-je calculer 0 * Tailleof (int) == 0 (taille du bloc de mémoire requis). Quelle "taille" signifie-t-il?

La "taille" est le produit (sans Taille_t limitation de la plage). La taille d'un objet n'est jamais 0 y compris Tailleof (int) , alors seul le test n doit tester. Avec calloc (n, sz) , où les deux sont des variables, je testerais avec si (n == 0 || sz == 0) plutôt que d'effectuer une multiplication qui apporte Dans les problèmes de débordement.


Pour éviter ce comportement défini de la mise en œuvre, des arguments de test en premier. Exemple: xxx

alternativement, pour tenir compte du comportement défini de la mise en œuvre, peut-être pas d'erreur sur calloc (0, taille de * p) retourner null . xxx


0 commentaires

1
votes

[Cette réponse s'adresse à la raison pour laquelle nous voudrions calloc et malloc pour fournir zéro octets de mémoire lorsque demandé. Il ne traite pas de ce que la norme C indique à ce sujet.]

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.

considère que ce qui est plus simple et plus court:

  • Le programme attribue de l'espace pour n les éléments de liste n les éléments de liste, et ce code fonctionne si n est zéro ou positif. < / li>
  • Le programme doit tester explicitement n et utiliser différents chemins de code selon que n est zéro ou positif.

    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 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.


0 commentaires