2

ヒープ上に配列を作成し、9から0までの文字で埋めることを望んでいた次のコードを理解するのに苦労しています([]表記を使用して、通常のスタック配列のように配列にインデックスを付けることができることはわかっていますこれを行うには、ポインターをより深く理解するためにこのようにしています):

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

完全に予期しない値を出力します。

上記を理解しているように、「new」コマンドはヒープ上に配列を作成し、配列があるアドレスへのポインターを送り返します。割り当てるポインター (ptrHeapArray) は int サイズであるため、ポインター ポスト インクリメントを使用して配列をナビゲートできると想定しました。しかし、結果は私の仮定が間違っていることを示しています。

これにより、おそらく「new」キーワードによって返されたポインターは配列全体への単なるポインターであり、何らかの理由で配列をステップスルーするために使用できないと考えるようになりました。そこで、「new」キーワードによって返されるポインターへの別のポインターを作成して、それを使用して配列の作成を試みました。

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

これはうまくいきました。なぜ私がこれをしなければならなかったのか、「new」キーワードによって返されたポインターを使用できなかったのか、誰かが説明できますか?

ありがとう

4

6 に答える 6

6

この線

ptrHeapArray++;

最初の for ループでは、ポインターがインクリメントされ、配列の先頭を指しなくなります。

この線

int *ptrHeapArray = new int[10];

10 個の整数にメモリを割り当て、ptrHeapArray をそのメモリの先頭にポイントします。for ループで、このポインターを移動します。ptrHeapArray が 3 番目の整数を指している場合:

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

次に、ptrHeapArray[2] は、元の番号が 4 の位置にある整数を返します。

于 2009-06-22T11:56:05.893 に答える
5

コードでポインターを変更しています。最初のスニペットの最初のループの後、ポインターは配列の先頭ではなく末尾を指します。物事を明確にするために、これも機能します(推奨されていませんが、動作を示しています):

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";
于 2009-06-22T11:56:51.397 に答える
1

ptrToHeapArrayPointer の名前が間違っています。ptrHeapArray と同じ場所を指している標準の int ptr です。名前を currentPositionPtr に変更すると、コードがより意味のあるものになる可能性があります。

于 2009-06-22T12:01:12.917 に答える
0

ptrHeapArray最初のループでは、配列の最後までポインターをインクリメントしました。したがって、最初の for ループを実行した後、ポインターは配列の先頭ではなく末尾を指しています。したがって、配列の内容を出力しようとすると、無効なメモリ割り当てにアクセスすることになり、予期しない動作になります。2 番目のケースでは、配列に値を割り当てる前に開始アドレスのコピーを取得しています。したがって、コピーを使用してコンテンツを印刷しようとすると、配列の先頭を指します。

于 2009-06-22T12:02:13.680 に答える
0

問題は、最初の例では ptrHeapArray が最初に配列の先頭に設定されていることです。ループを反復処理すると、ポインタがインクリメントされ、for ループの終わりまでに、配列の最後の要素を指しています。for ループを通過してすべての値を表示すると、ptrHeapArray が割り当てた配列の最後の要素を指しているため、配列の末尾を過ぎた値にインデックスが付けられます。

また、ヒープに割り当てられたメモリを適切に解放できるように、 new 演算子を使用して返された元のポインターを失わないようにする必要があることを覚えておくことも重要です。

于 2009-06-22T11:59:48.117 に答える
0

ptrHeapArray++ を実行すると、ptrHeapArray がインクリメントされます。データを印刷すると、ptrHeapArray は配列の先頭を指しなくなります。

于 2009-06-22T11:58:05.107 に答える