peut realloc déplacer le pointeur si la nouvelle taille est plus petite?

Je me demande si la norme C ou C ++ garantit qu’un pointeur n’est pas modifié lorsque realloc est appelé avec une taille plus petite (différente de zéro):

size_t n=1000; T*ptr=(T*)malloc(n*sizeof(T)); //<--do something useful (that won't touch/reallocate ptr of course) size_t n2=100;//or any value in [1,n-1] T*ptr2=(T*)realloc(ptr,n2*sizeof(T)); //<-- are we guaranteed that ptr2==ptr ? 

Fondamentalement, le système d’exploitation peut-il décider lui-même que, puisque nous avons libéré un bloc de mémoire volumineux, il souhaite tirer parti de tous les reallocs pour défragmenter la mémoire et, d’une manière ou d’une autre, déplacer ptr2?

http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

En cas de réussite avec une taille différente de 0, realloc () renvoie un pointeur sur l’espace alloué (éventuellement déplacé).

Non, pas de garantie

Il n’y a aucune garantie que realloc retourne le même emplacement, point final.

Avec realloc , vous n’obtenez aucune garantie quant à l’endroit où la mémoire vivra. Je pense que le malloc par défaut de libc ne fera que copier à contrecœur la mémoire, alors, dans la pratique, vous pouvez vous en sortir. Mais ne comptez pas dessus.

realloc n’est pas obligé de laisser le bloc en place même s’il conviendrait, et en fait, la mise en œuvre de stub la plus simple est un exemple dans lequel elle pourrait ne pas l’être:

  • malloc : appelez sbrk .
  • realloc : appelez malloc et memcpy .
  • free : no-op.

Cela peut sembler ridicule, mais parfois, pour les systèmes embarqués, une implémentation telle que je viens de la décrire est en fait la meilleure.

Il me semble que toutes les réponses actuelles (au moment de cette réponse) ne font référence à aucun document standard.

Pour C ++, je me référerai à Working Draft, Norme pour le langage de programmation C ++ , numéro de document: N3337, date: 2012-01-16, révisé: N3291 qui, selon https://isocpp.org/std/the-standard , est le document libre le plus proche du document standard officiel non normalisé C ++ 11; nous trouvons ici à 20.6.13 C bibliothèque :

2 Le contenu est identique à celui de l’en-tête de la bibliothèque Standard C, avec les modifications suivantes: [à mon avis, les modifications répertoriées ne sont pas pertinentes pour la question].

Alors maintenant, nous devons nous référer à la norme C.

Selon https://stackoverflow.com/a/83763/15485, le document gratuit le plus proche du document C11 standard non gratuit est Langages de programmation – C , N1570, projet de comité – 12 avril 2011 ISO / CEI 9899: 201x ; nous trouvons ici au 7.22.3.5 La fonction realloc :

4 La fonction realloc renvoie un pointeur sur le nouvel object ( qui peut avoir la même valeur qu’un pointeur sur l’ancien object ) ou un pointeur NULL si le nouvel object ne peut pas être atsortingbué.

Je ne parle pas anglais et il vous incombe d’interpréter le sens de “may have”.

Sous Windows, C-Runtime récupère un segment, puis alloue de la mémoire à partir de ce segment. Ainsi, le système d’exploitation ne saura pas à propos des allocations de mémoire individuelles, et donc ne déplacera pas les choses.