Peut-on réutiliser la mémoire allouée

Ceci fait suite à cette question .

Lors de l’explication de mon problème, j’ai déclaré que la mémoire allouée pouvait être réutilisée car elle n’avait pas de type déclaré, et on m’a dit qu’il était incorrect C.

Voici un exemple de code illustrant la question:

#include  #include  #include  #include  struct Elt { int id; char name[32]; }; struct Elt2 { double val; char name[16]; }; static_assert(sizeof(struct Elt2) id, elt->name); struct Elt2 *elt2 = (void *) elt; // declares a new pointer to a shorter type memcpy(elt2, &actual2, sizeof(*elt2)); // effective type is now struct Elt2 printf("elt2: %g %s\n", elt2->val, elt2->name); //printf("elt: %d %s\n", elt->id, elt->name); UB: storage now contains an Elt2 object free(elt); // only legal use for elt return 0; } 

Je crois que 6.5 Expression §6 du projet de n1570 le permet:

Le type effectif d’un object pour un access à sa valeur stockée est le type déclaré de l’object, le cas échéant.87) Si une valeur est stockée dans un object n’ayant pas de type déclaré via une lvalue ayant un type qui n’est pas un type de caractère , alors le type de la valeur devient le type effectif de l’object pour cet access et pour les access ultérieurs qui ne modifient pas la valeur stockée. Si une valeur est copiée dans un object sans type déclaré à l’aide de memcpy ou memmove, ou est copiée sous la forme d’un tableau de type caractère, le type effectif de l’object modifié pour cet access et pour les access ultérieurs qui ne modifient pas la valeur est le type. type effectif de l’object à partir duquel la valeur est copiée, s’il en a un.

avec note 87:

87) Les objects alloués n’ont pas de type déclaré.

Question:

Est-ce que la réutilisation de mémoire allouée pour stocker un object différent pouvant tenir dans ce C conforme à la mémoire ?

Sinon, ce serait catastrophique. Beaucoup de gens utilisent de telles astuces pour mettre en œuvre leur propre gestion de mémoire fine à malloc .

Donc, oui, c’est exactement ce dont parle le paragraphe de la norme que vous citez. Notez qu’il choisit les mots avec soin. Ça dit

Si une valeur est stockée dans un object n’ayant pas de type déclaré

cette propriété de ne pas avoir de type déclaré ne change pas pendant la durée de vie de l’object, la disposition s’applique dès lors qu’une nouvelle valeur y est écrite.

Si, pour une raison quelconque, le comité aurait voulu dire que le type efficace n’est modifiable qu’une fois, il aurait dit quelque chose comme:

Si une valeur est stockée dans un object n’ayant pas de type effectif

La seule réponse correcte est celle qui est entièrement dérivée de la norme.

Sans passer par la norme, je dirais: “Oui, votre hypothèse est correcte”. Je dis cela parce que sans cela, il ne serait pas possible de mettre en œuvre votre propre gestionnaire de mémoire. Je pense que même malloc ne pourrait pas être implémenté en C sans cela.