Frage

Ich habe Probleme mit dem folgende Stück Code zu verstehen, dass ich ein Array auf dem Heap schaffen würde habe gehofft, und füllen Sie ihn mit den Zeichen 9 bis 0 (Ich weiß, ich könnte nur Index den Array wie eine normale Stapelanordnung mit Notation [], dies zu tun, aber ich tue es auf diese Weise zu versuchen, Zeiger in mehr Tiefe zu verstehen):

int *ptrHeapArray = new int[10]; 

    for(int f=9; f>=0 ;f--)
    {
        *ptrHeapArray = f;
        ptrHeapArray++;
    }
    for(int f=0; f<10; f++)
        cout << ptrHeapArray[f]  << "\n";

Es druckt compleletly unerwartete Werte.

Wie ich das oben verstehen, der ‚neue‘ Befehl erstellt ein Array auf dem Heap und schickt mich einen Zeiger auf die Adresse zurück, wo das Array. Da der Zeiger I (ptrHeapArray) ist von int size zuweisen I angenommen I pointer Post verwenden könnte Inkrementieren durch das Array zu navigieren. Allerdings zeigen die Ergebnisse, dass meine Annahmen falsch sind.

Das hat mich zu denken, dass vielleicht der Zeiger wieder durch das ‚neue‘ Schlüsselwort übergab nur ein Zeiger auf das ganze Feld und nicht verwendet werden kann, aus irgendeinem Grunde durch das Array zu treten. Also habe ich versucht, eine anderen Zeiger auf die von dem ‚neuen‘ Schlüsselwort zurückgegebene Zeiger erstellen und verwenden, dass meine Array Bevölkerung zu tun:

int *ptrHeapArray = new int[10];  //array to hold FRANK data in 32 bit chunks
int *ptrToHeapArrayPointer = ptrHeapArray;

for(int f=9; f>=0 ;f--)
{
    *ptrToHeapArrayPointer = f;
    ptrToHeapArrayPointer++;
}
for(int f=0; f<10; f++)
    cout << ptrHeapArray[f]  << "\n";   

Das hat gut funktioniert. Kann jemand mir erklären, warum ich dies zu tun hatte und nicht nur den Zeiger übergeben, die mir von den ‚neuen‘ Schlüsselwort gesichert genutzt haben könnte?

Danke

War es hilfreich?

Lösung

Die Zeile

ptrHeapArray++;

in Ihrem ersten for-Schleife erhöht den Zeiger, so dass es nicht mehr an den Anfang des Arrays nicht zeigen.

Die Zeile

int *ptrHeapArray = new int[10];

ordnet den Speicher für 10 ganze Zahlen und Punkte ptrHeapArray zu Beginn dieses Speichers. In Ihrer for-Schleife bewegen Sie dann diesen Zeiger. Wenn ptrHeapArray verweist auf die dritte der ganzen Zahlen:

[0] [1] [2] [3] [4]
 ^       ^       ^
orig.    |       |
         |       +-- ptrHeapArray[2]
         |
         +-- ptrHeapArray now points here

dann ptrHeapArray [2] würden Sie die ganze Zahl an der Stelle geben orignally nummeriert mit 4.

Andere Tipps

Sie ändern den Zeiger im Code. Nach der ersten Schleife in dem ersten Code-Schnipsel, wird der Zeiger auf das Ende des Arrays weist eher als am Anfang. Um die Dinge klarer, das funktionieren würde auch (nicht vorgeschlagen, aber zeigt das Verhalten):

int *ptrHeapArray = new int[10]; 

for(int f=9; f>=0 ;f--)
{
    *ptrHeapArray = f;
    ptrHeapArray++;
}

ptrHeapArray -= 10; // reset the pointer to its original location

for(int f=0; f<10; f++)
    cout << ptrHeapArray[f]  << "\n";

Ihre ptrToHeapArrayPointer ist falsch benannt, ist es nur eine Standard-int ptr, die Sie an der gleichen Stelle wie ptrHeapArray hingewiesen habe. Wenn Sie es umbenannt Ihren Code currentPositionPtr vielleicht mehr Sinn machen.

Wenn Sie ptrHeapArray tun ++ es inscrements ptrHeapArray. Wenn Sie kommen, um die Daten auszudrucken ptrHeapArray nicht mehr auf den Anfang des Arrays.

Das Problem ist, dass in Ihrem ersten Beispiel ptrHeapArray zunächst an den Anfang des Arrays gesetzt. Wie Sie durch Ihre Schleife durchlaufen werden Erhöhen Sie den Zeiger, und am Ende der for-Schleife Sie im Array auf das letzte Element zeigen werden. Wenn Sie durch die for-Schleife gehen alle Ihre Werte anzuzeigen, Sie indizieren auf Werte über das Ende des Arrays seit ptrHeapArray in der Anordnung auf das letzte Element zeigt Ihnen zugeordnet.

Es ist auch wichtig, sich daran zu erinnern, dass Sie wahrscheinlich sicherstellen sollten, nicht den ursprünglichen Zeiger zu verlieren, von Ihnen bekam wieder den neuen Operator, damit Sie richtig den Speicher haben, die auf dem Heap zugewiesen wurde.

In der ersten Schleife erhöhen Sie Ihren Zeiger ptrHeapArray bis zum Ende des Arrays. So nach dem ersten Schleife für die Ausführung der Zeiger zeigen den Arrays zu beenden und nicht an dem beggining. Daher wird, wenn Sie den Inhalt des Arrays zu drucken versuchen, zugreifen Sie ungültige Speicherzuordnungen und das Verhalten unerwartet sein wird. Im zweiten Fall, nehmen Sie eine Kopie Ihrer Startadresse, bevor Werte in dem Array zuweisen. Also, wenn Sie versuchen, den Inhalt mit der Kopie zu drucken, wird es an den Anfang des Arrays zeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top