In diesem Programm (C, nicht C++), warum malloc immer die richtige Größe unabhängig von der Verwendung des Operators sizeof zurückgibt?Wird die Größe des Operators für malloc benötigt?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *c = malloc(3);
short *s = malloc(3); /* or malloc(3 * sizeof(short))? */
int *i = malloc(3); /* or malloc(3 * sizeof(int))? */
long *l = malloc(3); /* or malloc(3 * sizeof(long))? */
printf("%p\n", c++);
printf("%p\n", c++);
printf("%p\n", c++);
printf("---\n");
printf("%p\n", s++);
printf("%p\n", s++);
printf("%p\n", s++);
printf("---\n");
printf("%p\n", i++);
printf("%p\n", i++);
printf("%p\n", i++);
printf("---\n");
printf("%p\n", l++);
printf("%p\n", l++);
printf("%p\n", l++);
return 0;
}
Die Ausgabe lautet:
0x1e82010 (1 byte)
0x1e82011
0x1e82012
---
0x1e82030 (2 bytes)
0x1e82032
0x1e82034
---
0x1e82050 (4 bytes)
0x1e82054
0x1e82058
---
0x1e82070 (8 bytes)
0x1e82078
0x1e82080
bin ich etwas fehlt?
4.0.4-303.fc22.x86_64 Klirren Version 3.5.0 (Tags/RELEASE_350/final) Ziel: x86_64-RedHat-Linux-Gnu Thread-Modell: Posix
Sie machen Adressarithmetik; Sie greifen nicht auf den Speicher zu, was ebenso gut ist, da nur 3 Bytes zugewiesen wurden, so dass Sie für alle außer dem 'char *' - Teil auf Speicher außerhalb der Grenzen zugreifen. –
Was Sie tun, ist undefiniertes Verhalten. Die Tatsache, dass es "scheint" zu funktionieren, macht es nicht legal (oder gültig). Sie könnten diese Zeiger auf 'NULL' setzen und die gleichen Ergebnisse erhalten. – Cornstalks
Wie haben Sie festgestellt, wie viel Speicher malloc zugewiesen hat? –