Seite 1 von 1

malloc und realloc

Verfasst: 02.10.2022, 18:49
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

Re: malloc und realloc

Verfasst: 02.10.2022, 20:59
von Helmut
Schmeiß das Buch weg ;)

Re: malloc und realloc

Verfasst: 03.10.2022, 12:39
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.

Re: malloc und realloc

Verfasst: 03.10.2022, 13:40
von Schrompf
Du hast das alles korrekt erkannt, Starcow. Schmeiß das Buch weg.

Re: malloc und realloc

Verfasst: 04.10.2022, 18:03
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.

Re: malloc und realloc

Verfasst: 04.10.2022, 19:26
von Krishty
Starcow hat seine Frage explizit auf die malloc()-Zeile und die buffer-Variable bezogen, und hat damit völlig recht.

Re: malloc und realloc

Verfasst: 05.10.2022, 18:19
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

Re: malloc und realloc

Verfasst: 05.10.2022, 18:25
von Lord Delvin
Ok, dann habe ich deine Aussage ein bisschen zu wörtlich genommen :)

Re: malloc und realloc

Verfasst: 05.10.2022, 21:48
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

Re: malloc und realloc

Verfasst: 05.10.2022, 22:05
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

Re: malloc und realloc

Verfasst: 06.10.2022, 18:48
von dot

Re: malloc und realloc

Verfasst: 29.10.2022, 22:20
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.