Shrink tableau int C
Juste commencé à apprendre le C et suis tombé sur le problème suivant:
J'ai besoin de rétrécir un tableau d'entiers en C, la suppression d'éléments à la fin. En retirant je veux dire libérer. La réponse commune est d'allouer de la mémoire pour le petit tableau, après lequel copier tous les éléments ( -éléments à supprimer ) du tableau original dans la mémoire nouvellement allouée, et puis free() du tableau original.
Parce que je dois traiter avec très de grands tableaux, je préfère ignorer la copie de la partie.
Serait-il possible de créer une variable du pointeur qui pointe vers "près de la fin du tableau original" de taille "fin de la baie près de la fin", puis libérer le pointeur?
Merci d'avance
realloc
. Il n'est pas garanti, mais certaines implémentations en vous redonner le pointeur d'origine que vous avez passé, sans copier quoi que ce soit.Avez-vous envisagé d'utiliser
realloc
?Va realloc aussi gratuit quelque éléments sont supprimés à la fin? Je ne sais pas comment tester cette... merci pour la réponse rapide!
Eh bien, il serait redimensionner la quantité d'espace allouée à ce que vous dites qu'il (soit plus grand ou plus petit), je vais donner un exemple ci-dessous.
Pour répondre à la partie de votre question, il n'est pas possible pour
free()
de publier une partie d'un bloc de mémoire en passant un pointeur "vers la fin". Que serait certainement causer un accident ou d'un segment de la corruption.
OriginalL'auteur Joeri van Veen | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
La realloc fonction de la bibliothèque C standard pourrait être ce que vous voulez.
Dans votre cas, il est probable de ne PAS effectuer toute opération de copie, parce que le gestionnaire de mémoire a pas de raison d'affecter une nouvelle zone mémoire. Seule la différence entre l'ancienne et la nouvelle taille pourrait être récupérée par le système que la mémoire disponible.
Copie se ferait dans le cas où vous effectuez votre tableau plus grand, parce que malloc et les amis ne garantit pas que la mémoire après le "courant" de la zone est en fait gratuit. Si c'est le cas, alors c'est ok, l'actuelle allocation de mémoire sera élargi.
Si non, une plus grande mémoire disponible de la zone doit être trouvé, et il peut être alloué à peu près n'importe où en mémoire.
Je n'ai rien dit sur la façon dont il est défini. J'ai écrit plusieurs commerciaux malloc/reallocs et ont étudié le code des autres et de savoir comment ils sont mis en œuvre. Il est tout simplement faux, qu'est-ce est "probablement pas" libérer la mémoire ... la grande majorité de disponible reallocs le faire. Et à défaut de piste de la mémoire libérée de grandes allocations de fuites de mémoire. Certainement une option pour traiter un realloc d'une taille un peu plus petite qu'un noop, mais assez libre de le tampon et que l'espace sera disponible pour la réutilisation.
Si vous malloc un grand tampon, puis realloc à une taille un peu plus petite, que realloc pourrait simplement être un noop, laissant la taille allouée inchangé. Mais ceci n'est fait que pour de petites différences, pas de grands. (Dans la pratique, et non pas "par définition", bien sûr.)
La mise en œuvre serait de ne pas perdre la trace d'une petite quantité de mémoire libérée à partir d'une large répartition. Il serait tout simplement le conserver avec la large répartition. La mémoire n'est pas disponible pour les réutiliser jusqu'à ce que la totalité de l'allocation ont été libérés ou d'une autre, la réaffectation de raccourcir la demande d'espace suffisamment pour que la mise en œuvre a considéré qu'il vaut la peine de la séparation de la mémoire. Votre expérience n'est pas suffisamment de motifs pour un franc prétendre que realloc fait désallouer de la mémoire disponible. Il dépend de la mise en œuvre.
En déduire le comportement à partir des spécifications de conception, pas de pédanterie. En supposant favorable implémentations sans documentation causes de bugs. La négociation de petites quantités de mémoire (surtout net des montants négatifs lorsque le coût comptable dépasse la taille de l'espace dégagé) pour la vitesse n'est pas faible qualité; il est optimisé pour les performances.
OriginalL'auteur SirDarius
Avez-vous pensé à utiliser
realloc
?Vous pouvez le faire sans le
tmp
pointeur et justearray = realloc(array, 2*sizeof(int))))
mais qui pourrait conduire à des problèmes plus tard en bas de la route.OriginalL'auteur Keith Miller
Il est possible de concevoir un gestionnaire de mémoire qui rendrait possible, mais aucun d'couramment utilisés gestionnaires de mémoire ont cette propriété. Vous pouvez écrire vos propres mm et de l'utiliser pour ces tableaux.
OriginalL'auteur ddyer
Je voudrais utiliser realloc. Realloc peut copier la mémoire, mais cela pourrait être encore plus efficace que le roulement de votre propre gestion de la mémoire pour lutter contre le problème de la copie.
Certains vous diront qu'aucun bien comportés de la bibliothèque C copie lorsque la taille est plus petite. Ils ont probablement raison. Cependant, je ne l'utilise pas ou écrire commercial bibliothèques C, pour autant que je suis concerné, la demande est sans fondement.
D'accord; bien que, à ma connaissance, ce n'est pas garanti/dans le cahier des charges.
Les gens continuent de parler des garanties de la spécification en réponse à mes commentaires qui ne disent rien à ce sujet. La spécification ne garantit pas que malloc retourner un jour quelque chose, mais la valeur NULL. La compréhension du cahier des charges est important, mais si c'est tout ce qu'on comprend, c'est pédantisme, pas de génie.
Je ne suis pas en désaccord avec un point de vue particulier, et je vous promets de ne pas mettre des mots dans votre bouche si vous me permettre de la même courtoisie.
Je signale simplement que, quand je parle de "tous les commerciaux de la bibliothèque reallocs", un commentaire à propos de cahier des charges est un non sequitur ou strawman. Certainement il n'y a aucune garantie dans le cahier des charges que realloc ne sont pas copier ... il n'y a aucune garantie qu'il va réussir à tous ... mais qui n'est tout simplement pas intéressant de pratiquer des programmeurs.
OriginalL'auteur Tom