Adresse eines Arrays einem Pointer zuweisen und löschen

Gast #3869721
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:

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.
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.