Schrumpfen int-array C
Gerade angefangen C zu lernen und bin dabei auf das folgende Problem:
Brauche ich, um zu schrumpfen, ein integer-array in C, entfernen von Elementen am Ende. Durch das entfernen ich meine Befreiung. Die häufigste Antwort ist, um neuen Speicher für das kleinere array, nach dem kopieren alle Elemente (Elemente entfernen ) des ursprünglichen Arrays in den neu zugewiesenen Speicher, und dann free() des ursprünglichen Arrays.
Weil ich muss sich mit sehr großen arrays, die ich lieber überspringen das kopieren Teil.
Wäre es möglich, erstellen Sie einen Zeiger-variable, die Punkte zu "in der Nähe des Ende des original-array" Größe "Ende array - in der Nähe des Ende", und dann kostenlos die Zeiger?
Vielen Dank im Voraus
- Sie können schrumpfen mit
realloc
. Es ist nicht garantiert, aber einige Implementierungen tatsächlich geben Sie wieder die original-Zeiger übergeben, ohne Sie zu kopieren, nichts. - Haben Sie sich überlegt mit
realloc
? - Wird realloc auch frei was auch immer Elemente werden gelöscht am Ende? Ich möchte nicht wissen, wie um dies zu testen... danke für die schnelle Antwort, übrigens!
- Nun, es würde die Größe der Menge an Speicherplatz zugewiesen, was auch immer Sie sagen, es (entweder größer oder kleiner) werde ich Ihnen ein Beispiel unten.
- Zu Antwort Teil deiner Frage, es ist nicht möglich, für
free()
zu release Teil eines Speicherblocks, indem ein Zeiger "in der Nähe des Ende". Das würde fast sicher zu einem Absturz führen oder heap-Beschädigung. - Kommentar zu den Bearbeiteten Abschnitt: haben Sie richtig malloc ' ed das data-array vor der übergabe an diese Funktion ?
- "Die Daten (array) in Frage zugeordnet werden, mit "malloc" - ja, sicherlich. Bitte Lesen Sie in der Dokumentation für malloc und realloc.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den realloc Funktion aus der C standard-Bibliothek sein könnte, was Sie wollen.
In Ihrem Fall ist es wahrscheinlich NICHT ausführen jedem Kopiervorgang, da der Speicher-manager hat keinen Grund, weisen Sie eine neue memory-zone. Nur der Unterschied zwischen der alten und der neuen Größe könnte zurückgefordert werden vom system als Verfügbarer Speicher.
Kopieren auftreten würde, in dem Fall macht man das array größer, weil malloc und Freunde nicht garantieren, dass der Speicher nach der 'aktuellen zone" ist tatsächlich kostenlos. Wenn es so ist, dann ist es ok, und die aktuellen Speicher-Allokation erweitert werden.
Wenn nicht, einen größeren verfügbaren Speicher zone muss gefunden werden, und es kann zugewiesen werden, so ziemlich überall im Speicher.
Haben Sie sich Gedanken über die Verwendung
realloc
?Können Sie dies tun, ohne die
tmp
Zeiger und müssen nurarray = realloc(array, 2*sizeof(int))))
aber das könnte zu Problemen führen, später auf der Straße.Es ist möglich, design ein Speicher-manager, die machen würde, die möglich, aber keiner der Häufig verwendeten Speicher-Manager haben diese Eigenschaft. Sie konnte schreiben Sie Ihre eigenen mm und verwenden Sie es für diese arrays.
Ich würde realloc. Realloc kann kopieren Sie den Speicher, dies könnte aber noch effizienter sein, als Ihre eigenen Rollen-Speicher-management um das problem zu bekämpfen kopieren.
Einige werden Ihnen sagen, dass keine gut konzipierte C-Bibliothek kopiert werden, wenn die daraus resultierende Größe ist kleiner. Sie sind wahrscheinlich Recht. Allerdings glaube ich nicht schreiben oder kommerziellen C-Bibliotheken, so weit ich bin besorgt, ist der Anspruch unbegründet.