Frage zu realloc
-
Hi,
ich mußte gerade die Feststellung machen, daß wenn ich mehrmal realloc aufrufe, daß mein Programm abstrüzt.
Ich habe leider keine Idee wo der Fehler liegen könnte.Hier mal ein Beispiel:
int n=... int sz=500,i=0; int *feld=(int*)malloc(sz*sizeof(int)); for(i=0; i<n; i++) { feld[i]=i; //hierschreibe ich normal meine Daten in das Feld if(i==sz-1) { feld=(int*)realloc(feld,sz*sizeof(int)); sz*=2; } } feld=(int*)realloc(feld,i*sizeof(int)); //hier tritt dann der Fehler auf.
-
Vielleicht solltest du zuerst sz verdoppeln und dann reallokieren.
Außerdem solltest du den Rückgabewert von malloc/realloc nicht casten.
-
MFK schrieb:
Vielleicht solltest du zuerst sz verdoppeln und dann reallokieren.
Außerdem solltest du den Rückgabewert von malloc/realloc nicht casten.Also an sz liegt es nicht, da ich bei realloc, an einen Pointer neuen Speicher hinten dran hänge.
Das casten der Rückgabewerte muß gemacht werden, sonst gibt es ne Fehlermeldung.
-
daishi schrieb:
Also an sz liegt es nicht, da ich bei realloc, an einen Pointer neuen Speicher hinten dran hänge.
Tust du das? Cool. Bei allen Anderen hier tut realloc etwas anderes.
Aber du weißt es ja besser. Da ich offenbar im Gegensatz zu dir keine Ahnung habe, halte ich es ab jetzt bei deinen Fragen mit Dieter Nuhr: Ich halte einfach mal die Fresse. Für dich ist mir meine Zeit zu schade.
Das casten der Rückgabewerte muß gemacht werden, sonst gibt es ne Fehlermeldung.
Dann bist du hier im falschen Forum.
-
du solltest deinen Compiler als C und nicht als C++ Compiler uafrufen. Dann ist dieser prinzipiell problematische cast nicht nötig. Es heißt realloc und nicht addalloc, d.h. du mußt nicht angeben wieviel du dazu haben willst sondern angeben wieviel es insgesammt sein soll, dann sollte es gehen.
-
-
Die Art und Weise wie du realloc beschreibst, glaube ich das da bei dir ein Denkfehler vorliegt.
Also an sz liegt es nicht, da ich bei realloc, an einen Pointer neuen Speicher hinten dran hänge.
Realloc macht folgende Schritte.
Die Größenangaben von realloc sind dieselben wie die von malloc, man gibt die größe des gesamten nemötigten Bereichs in Byte an.
Fall 1
Ist die geforderte Größe in realloc kleiner als die bisherige größe des Memoryblocks so wird dieser verkleinert.Fall 2
ist die geforderte Größe größer als der bestehende allokiert Block wird geprüft ob er auf die neue Gesamtgröße vergrößert werden kann,
falls ja wird erweitert
falls nein wird mit malloc ein neuer Speicherbereich in der gewünschten Größe allokiert, die Daten aus dem alten memoryblock kopiert und dann der alte memoryblock freigegeben.Hier die Besdhreibung von realloc:
realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged. The return value points to a storage space that is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value.
Parameters
memblock Pointer to previously allocated memory block
size New size in bytes
Remarks
The realloc function changes the size of an allocated memory block. The memblock argument points to the beginning of the memory block. If memblock is NULL, realloc behaves the same way as malloc and allocates a new block of size bytes. If memblock is not NULL, it should be a pointer returned by a previous call to calloc, malloc, or realloc.
The size argument gives the new size of the block, in bytes. The contents of the block are unchanged up to the shorter of the new and old sizes, although the new block can be in a different location. Because the new block can be in a new memory location, the pointer returned by realloc is not guaranteed to be the pointer passed through the memblock argument.
-
@PAD
Ja, hast recht. DANKE
Der Fehler lag mal wieder zwischen den Ohren.Ok, jetzt funzt es.
DANKE DANKE DANKE
-
@daishi
Wo hast du diesen Spruch her?Der Fehler lag mal wieder zwischen den Ohren.
Du bist erst die zweite Quelle dafür, die andere wohnt in München und im Kaiserstuhl
-
@PAD
Ein Arbeitskollege von mir sagt immer:"Der Fehler liegt zwischen den Ohren/Kopfhörern", wenn ein Fehler einfach nicht auffindbar ist.Wieso?
-
@daishi hätte ja sein können, da wir die gleiche Quelle haben, aber bei der Konstellation Magedeburg München Kaiserstuhl ist das ja wol eher unwahrscheinlich
-
@daishi hätte ja sein können, da wir die gleiche Quelle haben, aber bei der Konstellation Magedeburg München Kaiserstuhl ist das ja wol eher unwahrscheinlich
Kann sein, muß aber nicht.
Ich treffe im Urlaub auch immer meine Nachbarn wieder, obwohl ich spontan irgendwohin fahre.In diesem Fall muß ich Dir aber beipflichten, daß es sich um verschiedene Personen handeln muß.