c / c ++:打印函数返回的double数组的错误

时间:2013-07-24 19:25:44

标签: c++ arrays function pointers double

我遇到以下代码的问题:

#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 个答案:

答案 0 :(得分:4)

您正在返回一个指向局部变量的指针,即数组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 ++语言。

答案 1 :(得分:2)

result在堆栈中分配。尝试在堆中分配它,如下所示:

double* result = new double[5]; 

答案 2 :(得分: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;
}

答案 3 :(得分:-1)

这是错误的:

double* FillArray(void) 
{   
    // Result ONLY has scope INSIDE of the FillArray function
    double result[5]; 

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

    }
    // Bad things will happen when the caller tries to use (now-invalid) "result"
    return result;

这是一个正确的选择:

#define ARRAY_SIZE 5

main ()
    double result[ARRAY_SIZE]; 
    FillArray (result, ARRAY_SIZE);
    for (int i = 0; i<ARRAY_SIZE;i++){
        cout << result[i] << endl; // print out the array
    }
    ...
void FillArray(double *array, int n) 
{   
    for (int i = 0; i<n;i++){
        array[i]=(double) i;