1

int配列を渡そうとしています。以下は私がやりたいことの例です。基本的には、ポインタを返すことでint配列を返す関数を書くことができます。次に、その関数を取得して、別の関数の引数として使用します。目標は、1つの関数でint配列を作成し、それを入力としてint配列を受け取る別の関数に入れることです。動作しません。int *ポインターを受け取る関数内では、int *ポインターは-8435432になり、別のint*ポインターに割り当てられた後にその要素を読み取ることはできません。理解できません。関数からint配列を取り戻すことができるのに、これを別の関数への入力として使用できないのはなぜですか?

int * returnIntArray()
{
    int * thePointer;
    int j[3];
    thePointer = j;

    j[0] = 1;
    j[1] = 3;
    j[2] = -1;
    return thePointer;
}

//
int * takesTheIntArray(int * anIntArray)
{
    int x,y,z;
    int * returnIt;
    returnIt = anIntArray;
    x = returnIt[0];
    y = returnIt[1];
    z = returnIt[3];
    return returnIt;
}


int _tmain(int argc, _TCHAR* argv[])
{
    int y,z,p;
    int * x;
    x = returnIntArray();
    y = x[0];
    z = x[1];
    x = takesTheIntArray(returnIntArray());
    cout << x[0] << ",  " << x[1];
    //cout << theVector[1];
    cout << "hello";
}
4

2 に答える 2

3
int * thePointer;
    int j[3];
    thePointer = j;

次のようにする必要があります。

int* thePointer = new int[3];

最初のバージョンの問題は、静的に割り当てられた (スタックに割り当てられた) 何かを返すことです。関数が戻るとスコープ外になります。2 番目のバージョンでは、動的に割り当てられます (ヒープに割り当てられます)。delete[]終了したら、忘れずに thePointerを呼び出してください (そうしないと、メモリ リークが発生します)。

于 2012-09-23T00:12:26.663 に答える
1

returnIntArray()は次のように書き直すことができます。

int * returnIntArray()
{
    static int j[3];

    j[0] = 1;
    j[1] = 3;
    j[2] = -1;
    return j;
}

jがスコープの最後で破棄されたローカル変数であるという事実を隠すだけの「thePointer」変数は必要ありません。「thePointer」変数なしで試して、「警告C4172:ローカル変数または一時変数のアドレスを返す」を取得した可能性があります。これは、返す値が戻った後は無効になることを意味します(thePointerで発生するのと同じ問題)。static before j宣言は、jをグローバルにします(ただし、関数内の名前でのみ使用可能)ので、jに含まれる値がスコープの最後で失われることはありません。

「takesTheIntArray」のポイントが、デバッガーでx、y、z値を確認するためのデバッグ目的である可能性があることを理解していませんでしたか?この場合、ポインタをコピーする必要はなく、次のようにすることができます。

//
int * takesTheIntArray(int * anIntArray)
{
    int x,y,z;
    x = anIntArray[0];
    y = anIntArray[1];
    z = anIntArray[2];
    return anIntArray;
}

メインを維持すると、これは希望どおりに機能するはずです:)[編集]再投稿時に気づかなかった「takesTheIntArray」にタイプミスがありました。zvarのanIntArrayインデックスは3ではなく2である必要があります[/edit]

于 2012-09-23T21:28:21.967 に答える