realloc Speicherproblem beim ersten Element unterschiedliche Adressen...
-
struct erg * daten = NULL; // in schleife daten = (struct erg*) realloc (daten, counter * sizeof(struct erg));
1 914212408 || 0x100225c0 2 914590008 || 0x100a3a38 --- 1. 0x100a3a10 0| 2. 0x100a3a38 914590008|
eigentlich sollten bei 1 jeweils die Adressen übereinstimmen (so wie bei 2) nur ist das nicht so Kann mir jemand einen Tipp geben, warum?
gruß
Dominik
-
zu wenig informationen.
-
struct erg{ long int mat; long long bau; int anzahl; int teile; double flaeche; double flaeche2; }; int counter = 1; struct erg * daten = NULL; while(bedingung > 1){ daten = (struct erg*) realloc (daten, counter * sizeof(struct erg)); counter++; }
Ist jetzt das meiner Meinung nach Relevante. Wenn ich einfach erst bei 2 Beginne (mit Counter) dann funktionierts...
-
Wenn man die bescheidene Frage äußern darf:
Was gibst Du da aus und vor allem wieso meinst Du sollte es gleich sein? (Ohne diese Informationen, sag mal, sollen wir erahnen was du tust?!)
-
mit realloc stelle ich ja speicher zur verfügung.
nach dem realloc gebe ich die adresse mit printf(%p aus. Nachher dann nochmal in einer anderen Methode laufe ich Struktur nochmal durch und gebe wieder printf(%p aus.
Da beim ersten Wert die Adressen unterschiedlich sind, denke ich, dass hier der Fehler/Problem liegt.
-
Gibst du diese Adressen in der Schleife aus? Wenn ja, ist klar, daß die Adresse sich ändern kann - wenn "hinter" dem bisherigen Datenblock nicht genug Platz ist, reserviert realloc einen neuen Bereich und kopiert die vorhandenen Daten dort rein.
-
ah ok, nochmals damit ich sicher bin, dass ich das verstanden habe:
start bei0x100225c0
und dann wird festgestellt, dahinter gibts nicht mehr ausreichend speicher -> gehe zu anderer Speicheradresse.
Aber warum "verliere" ich dann den ersten Wert? Eigentlich wird ja kopiert (CStoll)?!gruß und thx
dominik
-
An welcher Stelle schreibst/liest du denn diese Werte aus? realloc sollte eigentlich nichts verschlucken, also gehe ich eher davon aus, daß du etwas falsch einträgst: "*daten" ist immer das erste Element des Arrays - um ans Ende des Arrays zu kommen, mußt du "daten[counter-1]" verarbeiten.
-
gruppen[counter].mat = atoi(daten[s].mat); gruppen[counter].bau = atol(daten[s].bau);
counter zähle ich ja immer hoch, also am anfang ist der bei 1
-
freakx0 schrieb:
counter zähle ich ja immer hoch, also am anfang ist der bei 1
Und da haben wir den Fehler - der Index beginnt bei 0, also mußt du das Element "gruppen[counter-1]" bearbeiten (gruppen[counter] liegt außerhalb des Bereiches, den realloc() dir reserviert hat).
-
OHJA, sorry, dass ich dich (euch) so lange beansprucht habe, hätte mehr Source posten sollen...
nochmals vielen lieben dank!
gruß
Dominik