Verkleinern Sie das Array C

8

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

    
Joeri van Veen 29.08.2012, 19:03
quelle

4 Antworten

4

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.

    
SirDarius 29.08.2012, 19:06
quelle
1

Haben Sie über die Verwendung von realloc nachgedacht?

%Vor%

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.

    
Keith Miller 29.08.2012 19:11
quelle
0

Es ist möglich, einen Speichermanager zu entwerfen, der dies ermöglicht, aber keiner der üblicherweise verwendeten Speichermanager hat diese Eigenschaft. Sie könnten Ihre eigenen mm schreiben und sie für diese Arrays verwenden.

    
ddyer 29.08.2012 19:06
quelle
0

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.

    
Tom 29.08.2012 19:06
quelle

Tags und Links