2012-02-12 7 views
0

の配列のコードがあることを確認してください:私は私のプロジェクトで</p> <p>を新しい配列を作成しようとしていますCPP

#include <iostream> 
using namespace std; 
void makeArray(int *& arrayPtr, int size); 
int main() 
{ 
    int * arrPtr; 
    int size =10; 
    makeArray(arrPtr, size); 
    for(int j=0;j<size;j++) 
    { 
    cout<<arrPtr[j]<<endl; 
    } 
} 
void makeArray(int *& arrayPtr, int size) 
{ 
    int arr[size-1]; 
    for(int i=0;i<size;i++) 
    { 
    arr[i]=0; 
    } 

    *&arrayPtr=*&arr; 
} 

私が作るためにINORDER上記「makeArray」メソッドを使用する必要がある要件によると、配列。 私は任意のヘルプが

を理解されるであろう

.....出力はゴミ値ゼロでないコードを実行するあなたは、配列を作成する方法がスタック上にある、あなたに

+1

これもコンパイルできますか?あなたはGCCを使っていますか? – Mysticial

+0

最後の行はちょっと厄介だと思う:*&をつけることはそれを取り除くことと同じです。つまり、行は*&arrayPtr = arrと等しくなります。 –

+1

それでは、なぜ完全に良い 'std :: vector'クラスがあるときにこれをやっていますか?この学業はありますか? –

答えて

4

に感謝し、そのmakeArray関数の終了後に存在しないことを意味します。

ヒープ上に配列を割り当てる必要があります。

ので:

int arr[size-1]; 

は次のようになります。また

int *arr = new int[size-1]; 

、私はあなたがmakeArray()でこれを行うには意味を考える:

arrayPtr = arr; 

の代わりに:

*&arrayPtr=*&arr; 

この文脈ではコンパイルされていますが、より複雑で機能的には同じものです。

しかし、ポインタへの参照ではなくint *を返す方が好きかもしれません。

次にあなたがmain()の中で配列を使用して行われ、このように、ちょうどあなたが誤って再度使用する場合にはNULLに設定されている場合:

for(int j=0;j<size;j++) 
{ 
    cout<<arrPtr[j]<<endl; 
} 
delete [] arrPtr; 
arrPtr = NULL; 
+0

'new []'はポインタを返し、 'int'は返しません。 –

+0

Typo、キャッチしてくれてありがとう –

+0

メモリリークを避けるために、これを削除する場所を強調したいかもしれません。 – Johnsyweb

0

は、なぜあなたはint型としてパラメータを宣言しています* & arrayPtr '?配列へのポインタが必要ですか?代わりに 'int * arrayPtr'を使用してください。

あなたの質問に答えるには、問題はあなたが関数makeArrayのスタックで配列を宣言しているということです。関数が完了すると、その関数のスタックは破棄されるので、あなたは迷惑データのアドレスを渡しています。これを回避するには、代わりに動的メモリ割り当てを使用します。

EDIT:配列をゼロにするには、forループの代わりにmemsetを使用する必要があります。はるかに高速です。

+0

彼はポインタを再配置しているので、参照渡しする必要があります。 –

+0

ああ、ありがとうございます。私のC++ - fuは少し錆びています。 – pg1989

0

"makeArray()"で割り当てる "arr"はローカルです。関数が配列の上にあるときは解放されます。メインに戻ると、ゴミが出ます。 あなたがしたいことは、 "delete"でこのメモリを解放しない限り、 "new"演算子を使用してこの新しい配列をすべてのプログラムで使用するように割り当てることです。ちょうどあなたがfinsh後にこのメモリを解放することを忘れないでください

int * arrPtr = makeArray(10); 

:あなたがしてARRYを初期化する必要がありますメインに

int* makeArray(int size) 
{ 
    int *arr = new[size]; 
    for(int i=0;i<size;i++) 
    { 
    arr[i]=0; 
    } 

    return arr; 
} 

: は、あなたがにあなたのmakeArrayを()に設定することができます:

delete [] arrPtr;

関連する問題

 関連する問題