【问题标题】:c/c++: error of printing a double array returned by a functionc/c++:打印函数返回的双精度数组时出错
【发布时间】:2013-07-24 19:25:43
【问题描述】:

以下代码有问题:

#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() 中打印出来。

【问题讨论】:

  • FillArray() 函数结束时结果数组超出范围。
  • 调高编译器的警告级别,它应该告诉你这段代码有问题。
  • 你的标题有一个大问题:“c/c++”。坚持使用两种语言中的一种。要么放弃 C++,要么深入研究 std::vector 及其有用的伙伴。

标签: c++ arrays function pointers double


【解决方案1】:

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

【讨论】:

  • 对于 OP:如果您不知道什么是未定义行为,请查看 stackoverflow.com/questions/2397984/…
  • 那么,否决票的原因是什么?这个答案有什么错误、误导或争议吗?如果是这样,我很乐意考虑做出改变。
  • 几个问题:1) 数组(或者,可以说是更好的向量)仅存在于 C++ 中 - 而不是 C。2) 我不鼓励多次硬编码“5”。 3) 同样,我会使用 container::begin() .. container::end() 而不是 (for (int i=0; i
  • @paulsm4 很公平,只是我不会使用迭代器,因为需要索引。而且我还不想将 OP 与 std::iota 混淆,我不同意 vector 是更好的解决方案。 OP 有一个固定大小的数组。至于 C,我觉得这无关紧要,因为问题被标记为 C++。
  • 谢谢,但“std::array”只能在visual studio 2012中使用。
【解决方案2】:

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

double* result = new double[5]; 

【讨论】:

  • 谢谢,但是我用完后要删除。
  • 不客气。在main 你写double* a = FillArray();。所以,我以为你想从一开始就使用动态分配的数据;我不想更改FillArray 的签名。
【解决方案3】:

名为 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;
}

【讨论】:

    【解决方案4】:

    这是错误的:

    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;
    

    【讨论】:

    • 我会推荐反对任何情况下的代码示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2019-11-14
    • 2018-10-09
    相关资源
    最近更新 更多