ICH HASSE ZEIGER (in C) - Seite 2

Seite 2 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/ich_hasse_zeiger_in_c_176430/page_2 - zur Vollversion wechseln!


Armax schrieb am 30.03.2007 um 10:06

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 schrieb am 30.03.2007 um 10:12

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 schrieb am 30.03.2007 um 10:15

wieso allokierst du zwei gleich große speicherbereiche wenn du dann sowieso nur einen weiter verwendest? :confused:


semteX schrieb am 30.03.2007 um 10:24

das ist die nächste frage :D


Armax schrieb am 31.03.2007 um 19:39

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 schrieb am 31.03.2007 um 20:59

Ein Typecast geht prinzipiell schon - aber void* ist was anderes als char*. :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025