wieder realloc
-
Hallo,
Ich reserviere in der main eine Adresse
blockkennung *block = NULL;
Dann rufe ich eine Funktion auf um speicher zu erzeugen bzw. zu füllen.
Meine übergabeparameter sehen so aus
int lesen_vardatei(blockkennung **block)
In der Funktion erzeuge ich nun Speicher
if (*block == NULL) { *block = (blockkennung*) malloc(sizeof(block)); } else { max_block++; *block = (blockkennung*) realloc(*block , (max_block + 1) * (sizeof(blockkennung))); }
Wobei malloc funktioniert und bei realloc das Programm abschmiert.
Dies sehe ich wenn ich mit ddd das Programm debugge.
Ich sehe es einfach nicht.Gruß
worst_case
-
Und max_block ist was?
-
Hallo,
max_block ist die Anzahl des Array.
Diese Variable wird bei jeder Speicheranforderung incrementiert.Gruß
worst_case
-
"Schmiert ab"? Wie genau?
Im Debugger, ist es der erste Aufruf von realloc?
Wie groß ist zu dem Zeitpunkt max_block? (Wie wurde es initialisiert?)
Zudem kommt ein realloc mit einem NULL-Zeiger einem malloc gleich. Womit man das ganze evtl etwas kürzer schreiben kann.
-
worst_case schrieb:
max_block ist die Anzahl des Array.
Auf das Offensichtliche wollte ich jetzt nicht gerade hinaus
-
Hi,
if (*block == NULL) { *block = (blockkennung*) malloc(sizeof(block)); }
Was mir hier auf den ersten Blick auffällt:
Mit
sizeof( block)
ermittelst du die Größe des Pointers nicht aber die des Wertes.
Es sollte wohl eher
sizeof( **block)
heißen
odersizeof(blockkennung)
wobei ich ersteres bevorzugen würde.
Glaub aber kaum, dass das etwas mit deinem eigentlichen Problem zu tun hat.
mfg
asotbb
-
Hallo,
ich habe alles nur mit realloc gelöst.
d.h. 1. Aufruf mit Pointer "NULL"
2. Aufruf mit Pointer *blockSo funktioniert es.
Ich denke das auch dies die bessere Lösung ist.Danke
worst_case
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Deine Verwendung von realloc ist gefährlich. Schau mal in die FAQ: http://www.c-plusplus.net/forum/viewtopic.php?t=206606
-
Hallo Rüdiger,
rüdiger schrieb:
Deine Verwendung von realloc ist gefährlich. Schau mal in die FAQ: http://www.c-plusplus.net/forum/viewtopic.php?t=206606
gefährlich.... doch eher nicht, wie ich gelesen habe soll man unter C die Zeiger nicht casten und den Rückgabewert von realloc erst auf "NULL" abfragen bevor man diesen auf den "echten" Adresszeiger schreibt.
Oder meinst du etwas anderes ??
Gruß
worst_case
-
worst_case schrieb:
Oder meinst du etwas anderes ??
Gruß
worst_caseNee, er meinte, daß Du bei realloc einen temporären Pointer verwenden solltest. Wenn realloc fehlschlägt, hast Du nur einen pointer auf NULL und kannst den belegten Speicher nie mehr freigeben == memory leak == bad&unsafe style!!
Steht übrigens auch in der FAQ ...
-
Hallo,
"OK" das habe ich nun auch verändert.
Danke
worst_case