【问题标题】:Array return issue [duplicate]数组返回问题[重复]
【发布时间】:2016-11-30 16:34:23
【问题描述】:

我创建了一个树类和一个全局函数。我在 Tree 类函数“插入”中创建了一个数组,该数组使用从全局函数“返回”的另一个数组进行初始化。从全局函数返回的数组在该函数中工作正常,但是,它在分配给“插入”函数内的数组(必需数组)时会给出垃圾值。

这是代码 (抄袭问题未满)

float *func_calc(...,...,...,...)
{
    float decisions[17] = { 0 };
    ....
    .......
    ......... // Put Values into the 'decisions' array
    return decisions;
}

class Tree
{
    ..
    ....
    .....

    insert(...,...,...,...)
    {
    ....
    float* fun_array = new float[17];
    float min_num = 0;
    for (int i = 1; i <= 6; i++)
    {
        if (i == 1)
        {
            fun_array = func_calc(...,...,...,...); // same arguments as the    insert function arguments
            min_num = fun_array[0];
        }
        else
        {
            fun_array = entropy(i, array, arraysize, rD);
            float num = entfun_array[0];
            if (num  < min_ent)
            {
                min_num = num ;
            }
        }
    }
}
};

int main()
{
   Tree T1;
   T1.insert(... , ... , ..., ... );
}

【问题讨论】:

  • 你正在返回一个指向局部变量的指针,这是 UB。
  • 你能花点精力来格式化你的代码吗?
  • 使用浮点向量并返回
  • 局部变量是指fun_array?如何
  • 是的 SunAns,如果您不使用 clang-format,请放弃您正在做的事情并在您的系统上设置 clang-format。它。将要。改变。您的。生活。 ;)

标签: c++ arrays


【解决方案1】:

您将pointer 返回到一个临时的局部变量(这会导致未定义的行为),该变量分配在堆栈上,当函数返回时该变量会被释放。最好先创建一个array,然后传递给上面的函数。

或者,一个不受欢迎的、危险的方法可以是在函数内部将堆上的内存分配给decisions数组,以保留非本地内存:

float *decisions = malloc(17*sizeof(float));

但是,你需要释放(free())使用malloc()分配的内存,否则会出现内存泄漏。

【讨论】:

  • 由于抄袭问题,此答案应替换为点。
  • ^Dude 把卑鄙的 cmets 留给自己或回答我
  • 查看更新后的答案。 @SunAns
  • 你也是。如果需要,请考虑添加点。 (也可能支持):) @Slava
  • @Jarvis 我不能,抱歉。没有什么私人的,但我认为对极低质量问题的回答作为对这些问题的支持也是如此。
猜你喜欢
  • 1970-01-01
  • 2020-03-15
  • 2010-12-12
  • 1970-01-01
  • 2022-01-21
  • 2023-03-09
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多