Wie lese ich die Array-Größe aus einem überbelegten Speicherblock? [Duplikat]C++

Programme in C++. Entwicklerforum
Anonymous
 Wie lese ich die Array-Größe aus einem überbelegten Speicherblock? [Duplikat]

Post by Anonymous »

Ich versuche zu verstehen, woher delete[] arr die Größe von arr kennt. Und lesen Sie hier über Überzuteilung. Beim Testen

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
Es zeigt, dass zusätzliche 8 Bytes zugewiesen wurden, aber der aus (a-WORDSIZE) gelesene Wert ergibt für mich keinen Sinn.

Code: Select all

a = 0x7d7c2c0
b = 0x7d7c2e0
33
Meine Frage ist also, wie kann ich die Anzahl der Elemente im Array/Speicherblock aus dem Zeiger lesen (wenn eine Überzuweisung verwendet wird)?
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).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post