Gerade angefangen, C zu lernen und stieß auf das folgende Problem:
Ich muss ein Integer-Array in C verkleinern und Elemente am Ende entfernen. Indem ich entferne, meine ich zu befreien. Die allgemeine Antwort ist, neuen Speicher für das kleinere Array zuzuweisen, nach dem alle Elemente (- zu entfernende Objekte) des ursprünglichen Arrays in den neu zugewiesenen Speicher kopiert werden sollen, und dann das ursprüngliche Array () freizugeben.
Weil ich mit sehr großen Arrays umgehen muss, überspringe ich lieber den kopierenden Teil.
Wäre es möglich, eine Zeigervariable zu erstellen, die auf "nahe dem Ende des ursprünglichen Arrays" der Größe "Ende des Arrays - nahe dem Ende" zeigt und dann den Zeiger freigibt?
Vielen Dank im Voraus
Die Funktion realloc aus der C-Standardbibliothek ist möglicherweise das, was Sie wollen.
In Ihrem Fall wird wahrscheinlich KEINE Kopieroperation ausgeführt, da der Speichermanager keinen Grund hat, eine neue Speicherzone zuzuweisen. Nur der Unterschied zwischen der alten und der neuen Größe könnte vom System als verfügbarer Speicher zurückgewonnen werden.
Kopieren würde auftreten, wenn Sie Ihr Array größer machen, weil malloc und Freunde nicht garantieren, dass der Speicher nach der "aktuellen" Zone tatsächlich frei ist. Wenn ja, ist es in Ordnung, die aktuelle Speicherzuweisung wird erweitert. Wenn nicht, muss eine größere verfügbare Speicherzone gefunden werden, und sie kann praktisch überall im Speicher zugewiesen werden.
Haben Sie über die Verwendung von realloc
nachgedacht?
Sie können dies ohne den tmp
-Zeiger tun und haben nur array = realloc(array, 2*sizeof(int))))
, aber das könnte später zu Problemen führen.
Ich würde realloc verwenden. Realloc kann den Speicher kopieren, aber das könnte immer noch effizienter sein, als die eigene Speicherverwaltung zu rollen, um das Problem des Kopierens zu bekämpfen.
Einige werden Ihnen sagen, dass sich keine C-Bibliothek, die sich gut benimmt, kopiert, wenn die resultierende Größe kleiner ist. Sie haben wahrscheinlich Recht. Ich benutze oder schreibe jedoch keine kommerziellen C-Bibliotheken, so weit ich die Belege für unbegründet halte.