3

次のコードで問題が発生しました。

#include <iostream>
using namespace std;

double* FillArray(void) 
{   
    double result[5]; 

    for (int i = 0; i<5;i++){
        result[i]=(double) i;

    }
    return result; // return the pointer
}

int main()
{   

    double * a = FillArray();
    for (int i = 0; i<5;i++){
        cout << a[i] << endl; // print out the array
    }

    return 0;
}

出力は奇妙です:

0
3.47187e-236
8.89753e-308
8.8976e-308
3.90251e-236

私のコードで何が間違っているか教えていただけますか? 関数を使用して配列を返し、それを main() に出力しようとしました。

4

4 に答える 4

4

ローカル変数 array へのポインタを返していますresult。これは未定義の動作です。関数が戻ると、変数は存在しなくなるため、印刷を開始するまでに、ガベージ値を印刷します。

本当に配列を返したい場合は、次を使用できますstd::array

typedef std::array<double, 5> DArray5;

DArray5 FillArray() 
{
    DArray5 result; 

    for (size_t i = 0; i < result.size(); ++i){
        result[i] = i;
    }
    return result;
}

編集これは C++ のみの回答です。C/C++ 言語はありません。

于 2013-07-24T19:26:52.657 に答える
2

resultスタックに割り当てられます。次のように、ヒープに割り当ててみてください。

double* result = new double[5]; 
于 2013-07-24T19:29:49.843 に答える
0

result という配列が解放されます。このコードを試してください:

#include <iostream>
using namespace std;

void FillArray(double *result) 
{   
    for (int i = 0; i<5;i++){
        result[i]=(double) i;
    }
}

int main()
{   
    double result[5]; 
    FillArray(result);
    for (int i = 0; i<5;i++){
        cout << result[i] << endl; // print out the array
    }

    return 0;
}
于 2013-07-24T19:29:20.767 に答える