--
Die Tags werden natürlich ohne Leerzeichen geschrieben. Wenn man sie
aber so in den Text reinschreibt, werden sie ausgewertet und dann sind
sie für Dich nicht sichtbar ...
Sieh Dir mal den Hinweistext an, der hier oberhalb der Editbox steht.
-rufus
Du benutzt realloc falsch.
Du musst die Größe des gesamten benötigten BEreichs angeben, nicht nur
die vom neuen.
Und es wird die Adresse von diesem Bereich zurück gegeben.
Das kann eine andere Adresse als vorher sein.
PS. Die Code-Tags haben i.A. keine Leerzeichen
Albert schrieb:> if( (realloc(data, sizeof(weatherdata) * 10))!=NULL);
Das geht ganz gewaltig in die Hose, denn Du schmeißt den Rückgabewert
von realloc weg ...
Albert schrieb:> C-File:> [ c ]> void appendWeatherData(weatherdata *data, int *sizeOfData)> {> static int sizeOfDataSpace = 10;>> if (sizeOfDataSpace <= *sizeOfData) {>> if( (realloc(data, sizeof(weatherdata) * 10))!=NULL);
Wie Dirk schon schreibt, musst du den Rückgabewert nicht nur prüfen,
sondern dir auch merken. Da steht die neue Adresse des reallokierten
Speichers drin. Die verwirfst du aber und nutzt die alte, möglicherweise
nicht mehr gültige Adresse weiter.
Abgesehen davon ist das Semikolon am Ende der Zeile falsch.
> Main-File:> [ c ]> int main()> {> int size = 0;> weatherdata *data;>> data = (weatherdata*)calloc(10 ,sizeof(weatherdata));
Den Cast solltest du weglassen. Der ist überflüssig und kann sogar
Fehler verdecken.
Ich finde den Code generell recht umständlich und unnötig schwer
verständlich. Aber das ist denke ich für den Anfang normal.
Dirk B. schrieb:> PS. Die Code-Tags haben i.A. keine Leerzeichen
Wie man übrigens auch direkt über dem Eingabefeld bei den
Formatierungsregeln sehen kann. Es schadet auch nicht, vor dem Absenden
sich mal in der Vorschau anzusehen, ob alles passt.
Jetzt läuft es bis zum free(data) durch und da bekomm ich eine
Zugriffsverletzung. Woran liegt das ?
Wie läuft das eigentlich genau mit realloc?
Werden die vorhanden Daten kopiert und ein neuer Speicher daran gehängt?
Wird der alte Speicher automatisch freigegeben?
Albert schrieb:> Jetzt läuft es bis zum free(data) durch und da bekomm ich eine> Zugriffsverletzung. Woran liegt das ?
Ich denke, dass du das data nicht richtig aus appendWeatherData an main
zurück gibst.
Dazu brauchst du einen Doppelzeiger oder einen anderen Rückgabetyp als
void.
Albert schrieb:> Wie läuft das eigentlich genau mit realloc?
Woher kennst du denn realloc?
Da muss doch irgendwas erklärt worden sein.
realloc ist eine Funktion aus der C-Standardbibliothek.
Und die sind außerordentlich gut dokumentiert.
Z.B. http://www.cplusplus.com/reference/cstdlib/realloc/?kw=realloc
Da klären sich auch die andeen Fragen.
Aber wenn du beim realloc-Aufruf data gleich wieder überschreibst, dann
gehen dir im Fehlerfall (NULL) die Daten verloren.
Albert schrieb:> data = realloc(data, sizeof(weatherdata) * (sizeOfDataSpace+10));
Das ist zwar besser, aber immer noch ungeschickt.
Stell' Dir folgende Situation vor:
Vor dem Aufruf von realloc zeigt data auf Speicher, den Du mühsam
angefordert und gefüllt hast.
Nun willst Du mehr Speicher anfordern als verfügbar ist, was realloc
mit dem Zurückgeben von NULL quittiert.
Und was ist mit den Daten, auf die vorher data zeigte?
Die sind immer noch da. Aber Du hast mit der Zuweisung des Ergebnisses
von realloc an data weggeworfen, wo die Daten sind, d.h. Du kannst
den Speicher auch nicht mehr freigeben ...
Fazit: Niemals den Rückgabewert von realloc unmittelbar dem gleichen
Pointer zuweisen, der als erstes Argument übergeben wird. Nimm einen
Hilfspointer, prüfe den und erst wenn er nicht NULL ist, weist Du diesen
neuen Pointer dem jetz ungültigen Pointer data zu. Ist er aber NULL,
ist data nach wie vor gültig, und Du hast die Chance, irgendwas
sinnvolles damit anzufangen.
Das mit den Hilfs-Pointer macht sinn. Hab das geändert. Danke
Das mit dem datasize ausgeben versteh ich nicht. Da steht immer die
aktuelle Anzahle der Datensätze drin. Versteh nicht was es bringen soll.
Ich hab jetzt die Funktion geändert. Nun gibt Sie einen weatherData
Pointer zurück. Jetzt funktioniert auch das free.
Find es trotzdem komisch das es vorher nicht funktioniert hat. Immerhin
kann ich ja vor dem free noch auf alle Daten zugreifen ohne eine
Zugriffsverletzung.
Das hat vorher funktioniert, da main noch auf den alten Speicher zeigte,
den noch nichts überschrieben hat.
Das free ging nicht, weil malloc den Speicher schon zurück genommen hat.
Die Daten darin existieren aber noch.
Lass mal in Deinem alten Code appendWeatherData irgendein Feld in dem
reallocierten data ändern und lies das dann in main aus. Dann solltest
Du es sehen!
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang