Der folgende Code gibt die Folge von Speicheradressen eines dynamisch zugewiesenen Arrays und dann ein reguläres 2D-Array (von Ints) über verschachtelte for-Schleifen aus.
#include <iostream>
using namespace std;
int main()
{
int regArray[3][3]; //a normal 2d array
int **allocatedArray = new int*[3];
for (int i = 0; i < 3; i++)
allocatedArray[i] = new int[3]; //an allocated 2d array
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
cout << &allocatedArray[i][j] << " " << ®Array[i][j] << endl;
//prints the allocated array, leaves a space, then a regular one
}
Die Ausgabe ist wie folgt:
0x7812e8 0x29febc
0x7812ec 0x29fec0
0x7812f0 0x29fec4
0x781300 0x29fec8
0x781304 0x29fecc
0x781308 0x29fed0
0x781318 0x29fed4
0x78131c 0x29fed8
0x781320 0x29fedc
Process returned 0 (0x0) execution time : 0.249 s
Press any key to continue.
Ich weiß, dass im regulären Array (rechte Seite) die Adresse des nächsten Elements zu einer Erhöhung von 4 Bytes führt (in hexadezimaler Form). Im zugeordneten Array (linke Seite) scheint dies jedoch nicht der Fall zu sein. Während der Ausführung der inneren for-Schleife kommt es erwartungsgemäß zu einem normalen Anstieg von 4 Bytes. Immer wenn die äußere Schleife iteriert, scheint es eine Zunahme von 10 zu geben.
Ein Beispiel ist, wenn: 0x7812f0 zu 0x781300 springt.
Warum tritt das auf? Jede einfache Erklärung wird geschätzt.
2 Antworten
Beide Arrays sind zugeordnet. Sie verwenden jedoch unterschiedliche Zuordnungsformen ( automatisch bzw. dynamisch ).
Ihr erstes Array platziert 9 Ints an 9 aufeinander folgenden Speicherorten.
Ihr zweites Array weist drei separate Blöcke mit drei aufeinander folgenden Speicherplätzen zu. Diese 3 Blöcke können sich überall befinden, sie müssen sich nicht nebeneinander im Speicher befinden.
Ihre Ausgabe bestätigt dies.
Der folgende Code bedeutet, einem Zeigerarray einen Zeiger zuzuweisen
int **allocatedArray = new int*[3];
Und hier ist, jeden der Zeiger zu einem zugewiesenen Array zu machen
allocatedArray[i] = new int[3];
Der obige Code weist ein int-Array zu, das 12 Bytes betragen sollte, aber zwischen jeweils 2 des eindimensionalen Arrays keine Beziehung besteht.
Die Größe von allocatedArray[i][j]
beträgt also 4 Bytes und allocatedArray[i]
ist 12 Bytes
Die 10 Bytes, die Sie erwähnt haben, sind nur ein Zufall
Verwandte Fragen
Neue Fragen
c++
C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entwickelt und hat eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. Verwenden Sie ein versionsspezifisches Tag für Fragen zu einer bestimmten Standardversion [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] oder [C ++ 23] usw. .