Hi alle miteinder, Ich hab eine eher allgemeine Frage zur C-Programmierung. Wenn ich ein Pointer erzeuge und diese Adresse einem Array zuweise, kann ich dann den Pointer mit free freigeben oder ist das Array dann auch futsch? z.B uint8_t *test1; test1=(uint8_t*) malloc(3*sizeof(uint8_t)); uint8_t test2[3]; test2=test1; Das ist jetzt ein triviales Bespiel aber es hilft hoffentlich mein Problem zu verstehen. Vielen Dank im Vorraus
Ich schrieb: > kann ich dann den > Pointer mit free freigeben oder ist das Array dann auch futsch? ja, denn man überhaupt ja free nur eine Adresse, woher die kommt ist egal.
1 | |
2 | uint8_t *test1; |
3 | |
4 | test1 = (uint8_t*) malloc(3*sizeof(uint8_t)); |
5 | |
6 | uint8_t test2[3]; |
7 | |
8 | test2 = test1; // #### |
Das geht nicht. test2 kann nichts zugewiesen werden.
Rufus Τ. Firefly schrieb: > Das geht nicht. test2 kann nichts zugewiesen werden. Wieso geht das nicht, ich weise dem Array doch einfach nur die Adresse zu
Ich schrieb: > Rufus Τ. Firefly schrieb: >> Das geht nicht. test2 kann nichts zugewiesen werden. > > Wieso geht das nicht, ich weise dem Array doch einfach nur die Adresse > zu Du kannst einem Array keine Adresse zuweisen. Ein Array ist ein Objekt im Speicher. Das hat schon eine Adresse.
Ich schrieb: Deine ganze Ausdrucksweise zeigt, dass du da ein paar Dinge nicht verstanden hast. > Wenn ich ein > Pointer erzeuge Du erzeugst hier
1 | test1=(uint8_t*) malloc(3*sizeof(uint8_t)); |
aber keinen Pointer. Die Pointer-Variable hast du bereits! Du erzeugst hier dynamisch ein Array, genauer gesagt eigentlich einen Speicherbereich mit einer bestimmten Größe und weist dessen Adresse der Pointer Variablen zu. > und diese Adresse einem Array zuweise, kann ich dann den > Pointer mit free freigeben Du gibst auch nicht den Pointer frei sondern das worauf der Pointer zeigt.
Wenn du diese Variablen Defintionen hast
1 | uint8_t *test1; |
2 | uint8_t test2[3]; |
dann sieht die Sache im Speicher so aus
1 | test2 |
2 | +---+ test1 |
3 | | | +--------+ |
4 | +---+ | | |
5 | | | +--------+ |
6 | +---+ |
7 | | | |
8 | +---+ |
jetzt kommt der malloc zum Zug und reserviert irgendwo im Speicher einen Speicherbereich mit der Größe von 3 Stück uint8_t
1 | ... malloc(3*sizeof(uint8_t)); |
1 | test2 |
2 | +---+ test1 |
3 | | | +--------+ |
4 | +---+ | | |
5 | | | +--------+ |
6 | +---+ |
7 | | | +---+ |
8 | +---+ | | |
9 | +---+ |
10 | | | |
11 | +---+ |
12 | | | |
13 | +---+ |
wegen der Zuweisung wird die Startadresse dieses Speicherbereichs in test1 eingetragen.
1 | test1 = (uint8_t*) malloc(3*sizeof(uint8_t)); |
1 | test2 |
2 | +---+ test1 |
3 | | | +--------+ |
4 | +---+ | o | |
5 | | | +---|----+ |
6 | +---+ | |
7 | | | | +---+ |
8 | +---+ +--->| | |
9 | +---+ |
10 | | | |
11 | +---+ |
12 | | | |
13 | +---+ |
Man sagt jetzt auch, test1 zeigt auf diesen Speicherbereich. Die Zuwweisung geht deshalb, weil test1 so definiert ist
1 | uint8_t *test1; |
der Datentyp der Variablen ist 'uint8_t *'. Es ist also eine Variable, die auf einen Speicher zeigen kann. Machst du dann einen
1 | free( test1 ); |
so wird der Speicher, auf den test1 gerade zeigt, wieder frei gegeben und landet wieder im Vorrat, aus dem sich andere Aufrufe von malloc bedienen, wenn sie Speicher reservieren sollen.
1 | test2 |
2 | +---+ test1 |
3 | | | +--------+ |
4 | +---+ | o | |
5 | | | +---|----+ |
6 | +---+ | |
7 | | | | |
8 | +---+ +---> |
Beachte: Nur weil du einen free gemacht hast, bedeutet das nicht, dass dadurch der Pfeil, der von test1 ausgeht auch aufgelöst worden wäre. test1 zeigt immer noch auf denselben Speicherbereich. Nur ist dieser Speicherbereich nicht mehr zur Verwendung von deinem Programm reserviert! Mit test2 hat das alles überhaupt nichts zu tun. Dieses Array gammelt im Speicher einfach nur so vor sich hin.
:
Bearbeitet durch User
Und PS: Du sollst das Ergebnis eines malloc() nicht casten! In C ist so ein Cast unnötig und kann dir unter Umständen, wenn es blöd läuft einen Fehler verdecken. Will dein Compiler diesen Cast sehen, dann benutzt du keinen C Compiler sondern einen C++ Compiler. In diesem Fall solltest du anstelle von malloc besser new benutzen. Fazit: In C braucht es den Cast nicht. Er ist in C kontraproduktiv. In C++ würde es den Cast brauchen. Aber da benutzt man malloc nicht (ausser in Sonderfällen, wenn man ein Konglomerat aus C++ und C Code schreiben muss. Aber ich denke, soweit bist du noch nicht, dass das relevant wäre)
Hallo zusammen, wenn wir ein Skript hätten, was - Beiträge von Karl-Heinz sucht - mit den zugehörige Fragen alle zu einem PDF zusammenbaut würde kein Verlag mehr ein C-Buch verkaufen können weil das PDF viel besser wäre. Danke für die Mühe, Geduld und das Geschick! Erik
Ich schrieb: > uint8_t test2[3]; > test2=test1; > > Das ist jetzt ein triviales Bespiel aber es hilft hoffentlich mein > Problem zu verstehen. Ja, das Problem ist offenbar ein nicht vorhandenes C-Buch.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.