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] << "    " << &regArray[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.

0
54skyxenon 27 Dez. 2015 im 08:42

2 Antworten

Beste Antwort

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.

2
M.M 27 Dez. 2015 im 05:46

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

0
J3soon 27 Dez. 2015 im 05:59