2010-07-20 4 views
2

La norme specifies indique que le contenu de l'espace réaffecté est indéfini si la nouvelle taille est plus grande.Réallocation d'un tableau (C99)

Si la préservation du contenu de l'espace alloué précédemment est importante, le meilleur moyen de réallouer les données est le suivant: le copier dans la pile, le libérer du tas, allouer plus d'espace sur le tas et recopier au tas? Existe-t-il un autre moyen sûr de le faire?

Est-ce que la meilleure façon d'implémenter une structure de données comme un tableau à croissance dynamique qui ne fait que croître est sous la forme d'une liste chaînée?

Répondre

5

Le contenu de la "partie nouvellement allouée de l'objet n'est pas spécifié." Votre contenu sera toujours au début de la région de mémoire renvoyée.

dire que je fais:

char *p = malloc(6); 
if(p == NULL) { ... } 
memcpy(p, "Hello", 6); 
char *temp = realloc(p, 12); 
if(temp == NULL) { ... } 
p = temp; 

Les 6 premiers caractères à p sont garantis d'être 'H', 'e', ​​'l', 'l', 'o', '\ 0', peu importe si nouveau p est le même que vieux p. Les 6 autres "nouveaux" caractères sont tout ce qui n'est pas défini.

2

Seule la nouvelle partie de la mémoire est indéfinie. Par exemple, si vous aviez un tableau de 10 éléments, et que vous l'aviez réélé pour être assez grand pour 20 éléments, les 10 derniers éléments seraient indéfinis.

3

Vous interprétez mal la page. Il dit: "Le contenu de l'objet doit rester inchangé jusqu'à la moindre des tailles nouvelles et anciennes."

Aucun hacks requis, juste realloc().

4

"La norme spécifie que le contenu de l'espace réaffecté est indéfini si la nouvelle taille est plus grande."

Non, ce n'est pas le cas. Il dit:

"Le contenu de l'objet doit rester inchangé jusqu'à la moindre des tailles nouvelles et anciennes." "Si la nouvelle taille est plus grande, le contenu de la partie nouvellement allouée de l'objet n'est pas spécifié."

Seul le contenu de la nouvelle pièce n'est pas spécifié. Rien n'est perdu après realloc.

Questions connexes