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
der Datentyp der Variablen ist 'uint8_t *'. Es ist also eine Variable,
die auf einen Speicher zeigen kann.
Machst du dann einen
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.