警告:返回的局部变量'angles'的地址[-Wreturn-local-addr]

Jad*_*ade 3 c++ arrays pointers return function

我正试图从我的ODE(开放动力学引擎)模拟中返回一个身体对象的浮动x,y和z角度值.

float* Creature::eulerAngles(const float &q0, const float &q1, const float &q2, const float &q3){

    float angles[3] = {atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2)),
                      asin( 2 * (q0*q2 - q3*q1)),
                      atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3))};
    return angles;
}
Run Code Online (Sandbox Code Playgroud)

因为dBodyGetQuaternion返回4 const float四元数然后我需要得到旋转,并且我在尝试编译它时遇到了巨大的困难.现在它确实编译但我得到了这个警告.

任何人都可以向我解释为什么以及它意味着什么?

R S*_*ahu 10

float angles[3] = { ... };
Run Code Online (Sandbox Code Playgroud)

定义一个本地数组.

该声明

return angles;
Run Code Online (Sandbox Code Playgroud)

返回指向数组第一个元素的指针.

但是,一旦函数返回,数组就会被破坏.因此,返回的指针是悬空指针.

这就是编译器警告你的内容.如果取消引用调用函数中的返回指针,则会调用未定义的行为.

为了返回指向在函数返回后仍然有效的数组的指针,您需要分配动态内存并返回动态内存.

float* Creature::eulerAngles(const float &q0, const float &q1,
                             const float &q2, const float &q3)
{
   float* angles = new float[3];
   angles[0] = atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2));
   angles[1] = asin( 2 * (q0*q2 - q3*q1));
   angles[2] = atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3));

   return angles;
}
Run Code Online (Sandbox Code Playgroud)

请记住,如果您执行上述操作,则必须确保调用delete []调用函数中返回的指针.

为避免手动分配和释放内存的麻烦,您可以将其std::vector<float>用作返回类型.

std::vector<float> Creature::eulerAngles(const float &q0, const float &q1,
                                         const float &q2, const float &q3)
{
   std::vector<float> angles(3);
   angles[0] = atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2));
   angles[1] = asin( 2 * (q0*q2 - q3*q1));
   angles[2] = atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3));

   return angles;
}
Run Code Online (Sandbox Code Playgroud)

有了这个,内存管理就会自动完成.

由于数组的大小固定为3,因此使用std::array<float, 3>优于使用std::vectro<float>:

std::array<float, 3> Creature::eulerAngles(const float &q0, const float &q1, const float &q2, const float &q3)
{
   std::array<float, 3> angles;
   angles[0] = atan2(2 * (q0*q1 + q2*q3), 1 - 2 * (q1*q1 + q2*q2));
   angles[1] = asin( 2 * (q0*q2 - q3*q1));
   angles[2] = atan2(2 * (q0*q3 + q1*q2), 1 - 2 * (q2*q2 + q3*q3));

   return angles;
}
Run Code Online (Sandbox Code Playgroud)

  • `array&lt;float, 3&gt;` 可能是合适的,因为它似乎每次都返回相同的大小 (2认同)
  • 这非常有效,感谢您的深入解释。过去几个月我只使用 C++,仍然对指针的工作方式感到困惑,因此感谢有用的建议。 (2认同)