2012-04-02 23 views
0

まず、これが以前に尋ねられた場合はお詫び申し上げます。私は正しい情報を見つけることができないようです。私はそれが思ったとして、次のコードは「300」に印刷されませんメモリ割り当ての前に動的に割り当てられた配列ポインタをコピーすることは可能ですか?

:しかし

#include <iostream> 

int main() 
{ 
    int *array; 
    int *arrayCopy = array; 

    array = new int[4]; 

    array[0] = 100; 
    array[1] = 200; 
    array[2] = 300; 
    array[3] = 400; 

    std::cout << arrayCopy[2]; 

    return 0; 
} 

、私はそれを次の行の下の行

int *arrayCopy = array; 

を移動した場合には、ありません上記のコード。何故ですか?

(PS:メモリリークがあり、std :: vectorが優れていることを知っています...私はちょっと興味があります)。

+0

ところで、それは300ない200 :) – Naveen

+0

おっとを印刷します、ええ!良いキャッチ。 – Anthony

+0

メモリリークはありません。ポインタを変更することによって、割り当てられたブロックが「失われた」ことはありません。 – paxdiablo

答えて

4

たぶん、あなたは、ポインタへの参照を使用して考えているの?ここにあなたの現在のコードで何が起こるかです:

int *array; // Currently points to an undefined (invalid) memory location. 
int *arrayCopy = array; // Now this points to the same undefined memory location as array. 

array = new int[4]; // Now array points to valid memory, but arrayCopy still points to undefined space. 

あなたがが、このような何かをした場合、それは違う:

int *array; // Points to undefined 
int *&arrayCopy = array; // This is a reference to array. That means if you change array, arrayCopy will also reflect the changes. 

array = new int[4]; // Now since array points to valid space, arrayCopy does too. 

技術的には、これは別の事が起こっているので、完全に真実ではありません。参照は基本的にポインタと同じレベルの間接ですが、コンパイラはすべての逆参照を行います。しかし、私が説明したことは、本質的にどのように動作するかです。余分に&を貼り付けるだけで、あなたのコードはあなたが考えていたことをするでしょう。

5

いいえ、あなたはint *arrayCopy = array;を行うときに時間のその瞬間arrayCopyarrayの値を取り込むので、あなたが最初にarrayいくつかのランダムな場所を指している(注を変更した場合、あなたはそれが正しい場所を指すようnewを実行して)arrayの後にarrayCopyにコピーした場合、変更されたものはarrayCopyに反映されません。

3
int *array;     // array is ??? 
int *arrayCopy = array;  // copy is ??? 
array = new int[4];   // array is valid pointer, copy still ??? 

このコードスニペットは、次のない:

  • 不定値のintポインタを(何であってもよい)を作成します。
  • は、コピーに不確定な値をコピーします。
  • は、元のポインタの値を新しく作成された配列を指すように変更します。

つまり、3つ目の行は2つのポインタを「切断」し、コピーは未確定の場所を指しています。

ポインタコピーを参照解除することは、定義されていない動作であり、あなたが心配したくないものではありません。これとは対照的に

、シーケンスは(あなたの質問で述べたように)に変更された場合:

int *array;     // array is ??? 
array = new int[4];   // array is valid pointer 
int *arrayCopy = array;  // copy is now also the valid pointer 

その後、コピーポインタが元に設定されている元の配列を指すように初期化された後。切断が発生しないので、array[2]は実質的にarrayCopy[2]と同じです。

1

メモリ割り当ての前に動的に割り当てられた配列ポインタをコピーすることはできますか?

ただし、これを行うことができます:

int *array; 
int *&arrayReference = array; 
0
int *array; // points to some random value 
int *arrayCopy = array; // points to the same value 

array = new int[4]; // array points to a new value, arrayCopy does not 

あなたはすべての時点でのものは何でも「アレイ」のポイントを指すポインタを作成したい場合は、二重のポインタを作成

http://computer.howstuffworks.com/c32.htm

関連する問題