0

次のコードは、ガベージ値を出力しています。すべての要素に 5 を追加する関数に配列を渡していますが、その配列のポインターを返すと、メインにゴミが表示されます。

メインでインデックス作成とポインターの両方を試しましたが、結果は同じです。どうすればこれを修正できますか?

# include <conio.h>
# include <iostream>
using namespace std;

int * add5ToEveryElement(int arr[], int size)
{
    int theArray[5];
    for(int i=0; i<size; i++)
    {
        theArray[i] = arr[i] + 5;
        cout<<theArray[i]<<endl;
    }
    return theArray;
}

void main()
{
    const int size = 5;
    int noArr[size];
    for(int i=0; i<size; i++)
    {
        noArr[i] = i;
    }
    int *arr = add5ToEveryElement(noArr, size);
    cout<<endl;cout<<endl;
    for(int i=0; i<size; i++)
    {
        cout<<arr[i]<<endl;
    }
    cout<<endl;cout<<endl;cout<<endl;cout<<endl;
    for(int i=0; i<size; i++)
    {
        cout<<*arr<<endl;
        *arr++;
    }
    getch();
}
4

3 に答える 3

2

theArrayadd5ToEveryElement()main() に返す関数内のローカル配列です。これは未定義の動作です。

最低限、この行を変更できます。

int theArray[5];

に:

int *theArray = new int[5];

うまくいきます。delete後で main() で忘れないでください。元のポインターを変更したら、保存します。

int *arr = add5ToEveryElement(noArr, size);
int *org = arr;
// Rest of the code

//Finally

 delete[] org;
于 2012-12-23T09:00:10.120 に答える
0

関数から配列を返すことは一般的に悪いと考えられています。

「新しい」配列を持たなければならない場合を除き、C および C++ での典型的なケースは、入力配列を変更することです。CALLING 関数で 2 つの別個の配列が必要な場合は、独自のコピーを作成することで実現できます。あるいは、関数に 2 つの配列を渡すコードを書くこともできます。

void add5ToEveryElement(int arr[], int arr2[], int size)
{
    for(int i=0; i<size; i++)
    {
        arr2[i] = arr[i] + 5;
        cout<<theArray[i]<<endl;
    }
}

次に、メインは2つの配列引数で呼び出します。入力と出力として同じものを使用したい場合は、それも行います。

確かに、これはあなたの質問に対する正確な答えではありませんが、問題に対する「より良い」解決策を提供します。

私は通常、関数での割り当てを嫌います-特に「隠された」割り当て(この関数は、「各要素に5を追加した配列を割り当てる」ではなく、すべての要素に5を追加すると言います。コードは決して驚くべきことをすべきではなく、メモリの割り当ては少しです各要素に 5 を追加するように要求した場合は驚きです)

于 2012-12-23T10:24:42.053 に答える
0

これは完璧なコードです

# include <conio.h>
# include <iostream>
using namespace std;

int * add5ToEveryElement(int arr[], int size)
{
    int *theArray = new int[5];
    for(int i=0; i<size; i++)
    {
        theArray[i] = arr[i] + 5;
        cout<<theArray[i]<<endl;
    }
    return theArray;
}

void main()
{
    const int size = 5;
    int noArr[size];
    for(int i=0; i<size; i++)
    {
        noArr[i] = i;
    }
    int *arr = add5ToEveryElement(noArr, size);
    int *p = arr;
    cout<<endl;cout<<endl;
    for(int i=0; i<size; i++)
    {
        cout<<arr[i]<<endl;
    }
    cout<<endl;cout<<endl;cout<<endl;cout<<endl;
    for(int i=0; i<size; i++)
    {
        cout<<*arr<<endl;
        *arr++;
    }
    getch();
    delete[] p;
}
于 2012-12-23T10:32:29.420 に答える