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

您正在返回一个指向局部变量数组的指针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 回答
-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;
于 2013-07-24T19:31:15.837 回答