0

私は現在C++を学んでいるので、少しばかげているように見えたらごめんなさい。

私が立ち往生している現在の演習では、動的に割り当てられた n 個の要素を持つ整数配列へのポインターを返す関数 IndexArray(int n) を作成する必要があります。各配列は独自のインデックスに初期化されます。(ワークシートからコピー)。

私はこれを何度か読んだことがありますが、完全には理解していませんが、例を示しました。

intPtr が次のように宣言されていると仮定します

int *intPtr;

声明

intPtr = IndexArray(10);

次のメモリ構成を生成する必要があります。

intPtr ->  0 1 2 3 4 5 6 7 8 9

この例から、私の関数は 0 から n-1 までの値を持つサイズ n の配列を作成する必要があり、別のポインターがその配列を指す必要があると推測しています。

テストコードは次のとおりです。

int *values1;
values1 = IndexArray(10);

配列を簡単に作成する方法は知っていますが、実際に何をすべきかを理解できるほどポインターを完全には理解していません。配列を返すとうまくいくと思いました:

int *IndexArray(int n) {
    cout << n << endl;
    int arrayTemp[n];
    for(int i = 0; i < n; i++) {
        arrayTemp[i] = i;
    }
    return arrayTemp;
}

ただし、テストしたところ、values1 配列には 0 ~ 9 の値が含まれていません (ただし、arrayTemp は返される直前に含まれています)。

どんな助けも素晴らしいものになるでしょう。うまくいけば、私はあなたが助けるために必要なものすべてを与えました. ありがとう!:D

4

2 に答える 2

4
int arrayTemp[n];

ステートメントが関数内にあることに注意してください。関数が終了すると、arrayTemp []は使用できなくなり、削除されます。これは#local#変数です。

したがって、それを実行したい場合は、次を使用できます:

int * arrayTemp = new int[n];

注意:メモリリークを回避する方法については、削除する必要があります。

于 2013-03-14T05:14:00.450 に答える
2

これを行うことはできません:

int *IndexArray(int n) {
    cout << n << endl;
    int arrayTemp[n]; //declare a local array
    for(int i = 0; i < n; i++) {
        arrayTemp[i] = i;
    }
    return arrayTemp; //return a pointer to a local
}

ローカルへのポインタを返すことはできません。あなたが戻ると、地元の人は存在しなくなります。ポインタがガベージを指すようになりました。

代わりに、malloc(CまたはC ++)またはnew(C ++)を使用して10 intのストレージを動的に作成する必要があります。これはヒープ上に動的に作成されるため、戻った後も保持されます(edの場合はd、edの場合はdである必要がありますfree)で作成された配列でした。あなたで作成された単一のオブジェクトの場合は、)を使用します。mallocdelete[]newnewdelete

于 2013-03-14T05:14:55.843 に答える