Code: Select all
char* a = new char[24];
char* b = new char;
printf("a = %p\n", a);
printf("b = %p\n", b);
size_t n = *(size_t*)(a-8);
printf("%zu\n", n); // also tried different format specifier, output is always 33
Code: Select all
a = 0x7d7c2c0
b = 0x7d7c2e0
33
Bearbeiten:
Wie andere bereits betont haben, ist es nicht garantiert, dass sequentielle Speicherzuweisungen in sequentiellen Speicherblöcken platziert werden (und alle Speicherblöcke eine Mindestgröße haben), aber ich habe beim Erhöhen von a auf Größe 25 die Anzahl der Bytes zwischen beiden beobachtet char-Zeiger werden zu 48 und mit der Größe 41 wird die Differenz zu 64 und so weiter... .
Außerdem ist mir aufgefallen, dass n durchgängig der Differenz der Adressen +1 entspricht. Es scheint also, dass es der Speicherblockgröße entspricht, aber ich frage mich immer noch, warum Blockgröße + 1 und nicht die Anzahl der Elemente?
Und auch bei Verwendung eines nicht trivialen dekonstruierbaren Typs (Struktur mit einem Zeiger) beträgt die Differenz zwischen a und b immer 8 zusätzliche Bytes (oder 4 bei 32-Bit-Architektur).
Mobile version