Question

Je ne parviens pas à comprendre le code suivant que j'espérais créer un tableau sur le tas et le remplir avec les caractères compris entre 9 et 0 (je sais que je pourrais simplement indexer le tableau comme un tableau de pile normal avec [] notation pour faire ceci mais je le fais de cette façon pour essayer de comprendre les pointeurs plus en profondeur):

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";

Il imprime des valeurs complètement inattendues.

Si j'ai bien compris ce qui précède, la commande "new" crée un tableau sur le tas et m'envoie un pointeur à l'adresse où se trouve le tableau. Étant donné que le pointeur que j'attribue (ptrHeapArray) est de taille int, je suppose que je pourrais utiliser le pointeur après incrémentation pour naviguer dans le tableau. Cependant, les résultats indiquent que mes hypothèses sont fausses.

Cela m'a amené à penser que le pointeur renvoyé par le mot clé "nouveau" est simplement un pointeur sur l'ensemble du tableau et qu'il ne peut pas être utilisé pour parcourir le tableau pour une raison quelconque. J'ai donc essayé de créer un autre pointeur sur le pointeur renvoyé par le mot clé 'new' et je l'ai utilisé pour créer la population de mon tableau:

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";   

Cela a bien fonctionné. Quelqu'un peut-il m'expliquer pourquoi j'ai dû faire cela et que je ne pouvais pas simplement utiliser le pointeur qui m'était transmis par le mot clé "nouveau"?

Merci

Était-ce utile?

La solution

La ligne

ptrHeapArray++;

dans votre première boucle for incrémente le pointeur, de sorte qu'il ne pointe plus au début du tableau.

La ligne

int *ptrHeapArray = new int[10];

alloue la mémoire pour 10 entiers et pointe ptrHeapArray au début de cette mémoire. Dans votre boucle for, vous déplacez ensuite ce pointeur. Lorsque ptrHeapArray pointe sur le troisième des entiers:

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

alors ptrHeapArray [2] vous donnera le nombre entier à la position numérotée avec 4.

Autres conseils

Vous modifiez le pointeur dans le code. Après la première boucle du premier extrait, le pointeur pointe vers la fin du tableau plutôt que vers le début. Pour que les choses soient plus claires, cela fonctionnerait aussi (non suggéré mais montre le comportement):

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";

Votre ptrToHeapArrayPointer est mal nommé, c’est simplement un ptr standard que vous avez indiqué le même endroit que ptrHeapArray. Si vous l'avez renommé currentPositionPtr, votre code vous paraîtra plus logique.

Lorsque vous faites ptrHeapArray ++, il incrémente ptrHeapArray. Lorsque vous imprimez les données, ptrHeapArray ne pointe plus au début du tableau.

Le problème est que, dans votre premier exemple, ptrHeapArray est initialement défini au début du tableau. Lorsque vous parcourez votre boucle, vous incrémentez le pointeur. À la fin de la boucle for, vous pointez sur le dernier élément du tableau. Lorsque vous passez par la boucle for pour afficher toutes vos valeurs, vous indexez les valeurs situées au-delà de la fin du tableau, car ptrHeapArray pointe vers le dernier élément du tableau que vous avez alloué.

Il est également important de noter que vous devez probablement vous assurer de ne pas perdre le pointeur d'origine que vous avez obtenu en utilisant l'opérateur new afin de pouvoir libérer correctement la mémoire allouée sur le tas.

Dans la première boucle, vous avez incrémenté votre pointeur ptrHeapArray jusqu'à la fin du tableau. Ainsi, après avoir exécuté la première boucle for, votre pointeur pointe vers la fin du tableau et non vers le début. Par conséquent, lorsque vous essayez d'imprimer le contenu du tableau, vous accédez à des allocations de mémoire non valides et le comportement sera inattendu. Dans le second cas, vous prenez une copie de votre adresse de départ avant d’attribuer des valeurs au tableau. Ainsi, lorsque vous essayez d’imprimer le contenu à l’aide de la copie, il pointe vers le début du tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top