ICH HASSE ZEIGER (in C)
Armax 15.02.2007 - 09:05 2924 20
Armax
OC Addicted
|
ok... also aufräumen :iijak: Aber gerade wegen Frage 2 tritt immer folgender glibc error auf: *** 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 ... 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): 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
|
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
...
|
wieso allokierst du zwei gleich große speicherbereiche wenn du dann sowieso nur einen weiter verwendest?
|
semteX
begehrt die rostschaufel
|
das ist die nächste frage
|
Armax
OC Addicted
|
wieso allokierst du zwei gleich große speicherbereiche wenn du dann sowieso nur einen weiter verwendest? 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. 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? 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
ModeratorHoffnungsloser Optimist
|
Ein Typecast geht prinzipiell schon - aber void* ist was anderes als char*.
|