Ich kürze mal Deinen Source, weil hier viel Überflüssiges die Sicht
vernebelt:
1 | void test(void)
|
2 | {
|
3 | unsigned char *ptr2;
|
4 | unsigned short number = 23;
|
5 | ptr2 = (unsigned char *)malloc(number);
|
6 | free(ptr2);
|
7 | }
|
8 |
|
9 | int main(void)
|
10 | {
|
11 | unsigned int length = 12;
|
12 | unsigned char *ptr;
|
13 |
|
14 | ptr = malloc(length);
|
15 | free(ptr);
|
16 | //<- diese Aufrufe funktionieren und es werden 12 bytes auf 0x00
|
17 | //im speicher gesetzt
|
18 |
|
19 | while(1)
|
20 | {
|
21 | ptr = malloc(length);
|
22 | if(ptr != NULL)
|
23 | {
|
24 | test();
|
25 | free(ptr); //hier werden nur noch vier bytes auf 0x00 gesetzt
|
26 | //die ersten vier Bytes
|
27 | }
|
28 | }
|
29 | }
|
Was habe ich geändert:
1. Den Pointer beim Aufruf von GetMem() ersetzt durch den Wert von
length, denn hier ist kein Pointer notwendig.
2. die Konstruktion sizeof (sizeof(unsigned char) * *len) durch (len)
ersetzt, denn die Multiplikation ist unsinnig. Du willst length
Bytes.
3. Deine NULL-Pointer-Abfrage in GetMem() komplett gestrichen.
4. Letztendlich GetMem() komplett rausgeworfen, denn nun macht es
nichts anderes mehr als malloc() selbst.
Dass irgendwann 12 Bytes und später mal 4 Bytes im Speicher auf 0x00
gesetzt werden, ist kein Kriterium für korrekte/inkorrekte
Funktionalität. malloc() erhebt keinen Anspruch darauf, den allokierten
Speicher auch zu löschen. Das macht nur calloc(). Bei malloc() ist der
Inhalt des allokierten Speichers undefiniert.
> Beispiel: für ptr wird 0x100009C8 zurückgegeben nach malloc und für ptr2
> wird ebenfalls als Startaddr von malloc 0x100009C8 zurückgegeben...
Das gibt mir allerdings zu denken. Dürfte nicht sein.
Ich kürze mal weiter:
1 | int main(void)
|
2 | {
|
3 | unsigned char *ptr;
|
4 | unsigned char *ptr2;
|
5 |
|
6 | ptr = malloc(12);
|
7 | free(ptr);
|
8 |
|
9 | while(1)
|
10 | {
|
11 | ptr = malloc(12);
|
12 |
|
13 | if(ptr != NULL)
|
14 | {
|
15 | ptr2 = malloc(23); // ist hier nun ptr == prtr2?
|
16 | free(ptr2);
|
17 | free(ptr);
|
18 | }
|
19 | }
|
20 | }
|
Ist an der markierten Stelle nun ptr == ptr2 ?