"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

ICH HASSE ZEIGER (in C)

Armax 15.02.2007 - 09:05 2924 20
Posts

Armax

OC Addicted
Registered: Apr 2004
Location: .
Posts: 1058
ok... also aufräumen :iijak: :p

Aber gerade wegen Frage 2 tritt immer folgender glibc error auf:
Code:
*** glibc detected *** double free or corruption (!prev): 0xirgendwas ***
Aborted
eigentlich ziemlich eindeutig oder? wenn ich nur einen der beiden pointer (egal welchen!) "free"he dann funkts nämlich auch tadellos ... :confused:
Reicht unter diesen Umständen nicht auch wenn man nur eine der beiden Variablen "free"d?
Hier ist einmal der betreffende Orginalcode (zahlen ersetzen zT. Variablen):
Code:
void *buffer = malloc(5 * 64 * sizeof(float));
foat *input = (float*) malloc(5 * 64 * sizeof(float));
input = (float *) buffer;
// Verarbeitung geht weiter mit input
free(buffer); free(input);

Mal ein herzliches danke an alle für die Hilfe hier! :)

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14594
du setzt input auf den beginn von buffer.

danach freest du buffer. somit ist der von buffer allokierte speicher weg. der von input allokierte speicher ist noch da, aber nicht mehr accessable, da du mit dem zeiger alle brücken abgebrochen hast..

und jetzt freest du nochmal buffer (input zeigt ja auf den buffer - speicherbereich!)!

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3279
wieso allokierst du zwei gleich große speicherbereiche wenn du dann sowieso nur einen weiter verwendest? :confused:

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14594
das ist die nächste frage :D

Armax

OC Addicted
Registered: Apr 2004
Location: .
Posts: 1058
Zitat von DKCH
wieso allokierst du zwei gleich große speicherbereiche wenn du dann sowieso nur einen weiter verwendest? :confused:

Siehe post #2 bzw #3!
Ich hab bei dem o.a. Code die funktion auslassen, aus der ich die Daten in den Buffer einlese: diese verlangt als Übergabeparameter (dst) einen void-pointer.
Code:
size_t this_function(pre_defined_structure src, char* dst, size_t cnt);
Um mögliche Fehlerquellen auzuschließen hab ich einfach ne neue Variable eingführt die ich dann type-caste. Würd's so auch gehen?
Code:
c = this_function(input_buffer, (void *)(buffer), buffer_size);
(wenn buffer wie vorher ein float-array ist und buffer_size die Länge ist, die mit malloc allokiert wurde)

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Ein Typecast geht prinzipiell schon - aber void* ist was anderes als char*. :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz