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
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 beobachtet, dass beim Erhöhen von a auf die Größe 25 die Anzahl der Bytes zwischen beiden char-Zeigern 48 wird und mit Größe 41 die Differenz wird 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