malloc und realloc

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

malloc und realloc

Beitrag von starcow »

Abend zusammen :-)
Ich stehe hier mit einer kleinen Übung zu realloc etwas auf dem Schlauch.
Konkret geht es um folgendes Beispiel:

Code: Alles auswählen

/* more_mem.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF 8192
int main(void) {
   char *buffer;
   int reserviert=0;
   int i;
   static size_t len = BUF; /* Speicheranforderung */

   buffer = malloc(sizeof("Hallo Welt"));
   strcpy(buffer, "Hallo Welt");

   while(reserviert != BUF && len != 0) {
      buffer = realloc(buffer, len);
      /* Speicher konnte nicht alloziert werden. */
      if(buffer == NULL) {
         len /= 2;  /* Versuchen wir es mit der Hälfte. */
      }
      else {
         reserviert += len;
      }
   }

   for(i = 0; i < reserviert; i++)
      buffer[i] = 'x';
   buffer[i]='\0';
   printf("\n%s\n",buffer);
   return EXIT_FAILURE;
}
Wenn ich versuche das Beispiel nachzuvollziehen, komme ich auf ein anderes Ergebnis.
Praktisch kann ich es leider auch nicht nach nachprüfen, da bei mir der Speicher natürlich erfolgreich reserviert wird.

Zwei Dinge verstehe ich hier nicht:
1) buffer beinhaltet ja die Adresse, die mir malloc zu Beginn zugewiesen hatte. An dieser Stelle steht ja mein "Hallo Welt".
Sollte jetzt realloc tatsächlich fehlschlagen, wird mir doch die Adresse, die in buffer gespeichert ist, mit NULL überschrieben.
Das muss ja eigentlich auch laut des Beispieles so sein, denn wieso sollte man sonst buffer == NULL prüfen?
Ich hätte also ein Memory-Leak und mein "Hallo Welt" verloren. Nein?

2) Bei realloc muss ich doch die neue totale Grösse angeben und nicht blos den Wert, um den vergrössert werden soll.
Nur wird "len" ja immer kleiner, sofern nicht genügend zusammenhängender Speicher reserviert werden kann.
Müsste da also nicht sowas wie

Code: Alles auswählen

 realloc(buffer, reserviert + len);
stehen? Oder an welcher Stelle überlege ich hier falsch?

Weiter schreibt der Autor über malloc:
Zur dynamischen Speicherverwaltung wird ein Zeiger an die Funktion malloc() übergeben, der später die Anfangsadresse der dynamischen Datenstruktur enthalten soll.
Und einige Seiten später:
Die Tatsache, dass Zeiger in C grundsätzlich typisiert sind, spielt hier keine Rolle, denn malloc() bekommt ja grundsätzlich void-Zeiger übergeben.
Ich verstehe nicht, wie das gemeint ist. Ich übergebe malloc() doch keinen Zeiger - vielmehr bekomme ich doch einen void-Zeiger von malloc() zurück. Nein?

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: malloc und realloc

Beitrag von Helmut »

Schmeiß das Buch weg ;)
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: malloc und realloc

Beitrag von Lord Delvin »

Helmut hat geschrieben: 02.10.2022, 20:59 Schmeiß das Buch weg ;)
Ich glaube auch. Nimm dir lieber irgendein 90er Jahre Spiel und baue ein Remake mit C++ und SDL. Ich denke da lernt man mehr, hat mehr Spaß und kann was vorzeigen.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: malloc und realloc

Beitrag von Schrompf »

Du hast das alles korrekt erkannt, Starcow. Schmeiß das Buch weg.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: malloc und realloc

Beitrag von Lord Delvin »

starcow hat geschrieben: 02.10.2022, 18:49 Ich hätte also ein Memory-Leak und mein "Hallo Welt" verloren. Nein?
Nein. Literale werden in der Regel nicht oder durch globale konstanten und einen Zeiger darauf repräsentiert. Da kann man kein memory leak haben, weil es immer existiert. Cum granu salis und Allokations-/Deallokationsregeln in diversen Sprachen wie C++. Für ein C-Stringliteral wird das aber gelten.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Krishty
Establishment
Beiträge: 8227
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: malloc und realloc

Beitrag von Krishty »

Starcow hat seine Frage explizit auf die malloc()-Zeile und die buffer-Variable bezogen, und hat damit völlig recht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: malloc und realloc

Beitrag von starcow »

Ihr habt wohl recht. So langsam ist auch mein Vertrauen in dieses Buch erschöpft. Irgendwie hätte ich das bei den guten Rezensionen und diesem doch eher bekannten Verlag echt nicht erwartet - zumindest in dem Ausmass. Bislang hatte ich immer die Vorstellung, dass wenn man in dieser "Breite" etwas veröffentlicht (veröffentlichen kann!), man sich mindestens noch über eine weitere kompetente Person "absichert". Fehler passieren, das ist klar. Doch in diesem Ausmass finde ich das schon heftig.
In der Errata, die mir der Autor jetzt doch noch geschickt hat, war übrigens keiner dieser Fehler aufgeführt.

Danke an euch an dieser Stelle! Ich wüsste echt nicht, was ich ohne dieses Board - ohne euch (!) machen würde! :-)

@Lord Delvin
Ich bin mir jetzt nicht sicher, auf welche Stelle sich deine Aussage jetzt genau bezieht. Aber wie Krishty ja richtig erkannt hat, meine ich ja nicht das String Literal "Hallo Welt" an sich - sondern den Speicherbereich, der über malloc reserviert wurde (und auf den der Pointer "buffer" zeigt).
Über strcpy werden ja die Zeichen aus dem String Literal in den Speicherbereich auf dem Heap kopiert. Und die Adresse die in buffer gespeichert ist, verliere ich ja in dem Moment, wenn mir realloc einen Nullzeiger liefern sollte.

LG, starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 574
Registriert: 05.07.2003, 11:17

Re: malloc und realloc

Beitrag von Lord Delvin »

Ok, dann habe ich deine Aussage ein bisschen zu wörtlich genommen :)
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Jonathan
Establishment
Beiträge: 2348
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: malloc und realloc

Beitrag von Jonathan »

Kannst du nochmal kurz den Namen des Buches und dessen Autor nennen, damit man das als Warnung für die Zukunft hat? :D
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: malloc und realloc

Beitrag von starcow »

Konkret geht es um dieses Buch:
"C von A bis Z: Das umfassende Handbuch für C-Programmierer. Zum Lernen und Nachschlagen. Aktuell zum Standard C18 Hardcover – 28 May 2020"
by Jürgen Wolf (Autor), René Krooß (Autor)

https://www.amazon.de/-/en/J%C3%BCrgen- ... 107&sr=8-1

Ich habs in der zur Zeit neusten, 4. Auflage.

Das Buch gibts auch als OpenBook online, in einer etwas ältere Auflage.
Die Fehler sind aber weitgehend die selben.
https://openbook.rheinwerk-verlag.de/c_ ... x.htm#_top
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: malloc und realloc

Beitrag von dot »

Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: malloc und realloc

Beitrag von starcow »

dot hat geschrieben: 06.10.2022, 18:48 https://www.c-plusplus.net/forum/topic/ ... ignet-weil ;)
Das ist wirklich ziemlich aufschlussreich, danke dot! :-)

Ich stehe mittlerweile mit dem Autor - Rene Krooß - in Kontakt, der das Buch von Jürgen Wolf übernommen hatte.
Er scheint mir wirklich sehr freundlich und aufgeschlossen. Ich kann mir gut vorstellen, dass ihm am Buch wirklich was liegt.
Den Link habe ich ihm mitgeteilt.
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Antworten