我在从指针获取值时遇到问题。我在C ++中有以下代码:
void* Nodo::readArray(VarHash& var, string varName, int posicion, float& d)
{
//some code before...
void* res;
float num = bit.getFloatFromArray(arregloTemp); //THIS FUNCTION RETURN A FLOAT AND IT'S OK
cout << "NUMBER " << num << endl;
d = num;
res = #
return res
}
int main()
{
float d = 0.0;
void* res = n.readArray(v, "c", 0, d); //THE VALUES OF THE ARRAY ARE: {65.5, 66.5};
float* car3 = (float*)res;
cout << "RESULT_READARRAY " << *car3 << endl;
cout << "FLOAT REFERENCE: " << d << endl;
}
运行此代码的结果如下:
NUMBER 65.5 RESULT_READARRAY -1.2001
//不正确它应该像数字一样 浮动参考:65.5 //正确NUMBER 66.5 RESULT_READARRAY -1.2001
//不正确它应该像数字一样 浮动参考:66.5 //正确
由于某种原因,当我得到名为readArray的函数返回的指针的值不正确时。我在同一个函数中传递一个浮点变量(d)作为参考只是为了验证该值是否正常,如您所见,浮动参考与NUMBER相匹配。如果我将变量num(读取数组)声明为静态浮点数,则第一个RESULT_READARRAY将为65.5,这是正确的,但是,下一个值将是相同的而不是66.5。让我向您展示使用静态浮点变量运行代码的结果:
NUMBER 65.5 RESULT_READARRAY 65.5
//完美的浮动参考:65.5
//¨完美号码65.5 //这是不正确的,它是 应该是66.5 RESULT_READARRAY 65.5
浮动参考:65.5
您知道如何获得名为readArray()的函数返回的正确值吗?
答案 0 :(得分:4)
您正在返回指向堆栈变量(局部变量)的指针,该函数在您离开该函数后不再有效。它被称为dangling pointer。
一种解决方法是使用
float *num = new float(bit.getFloatFromArray(arregloTemp);
// ...
return (void*)num;
会强制num
在堆上分配,允许在函数退出后使用指针。
但对于上面的示例,更好的选择是让readArray
返回float
并返回num
的值。你似乎没有通过在这里返回指针获得任何东西。
答案 1 :(得分:2)
num
变量在堆栈内的范围内声明。一旦函数返回该内存位置不再可用,虽然您很可能能够访问它,但它(通常)不会保留您需要的值。无论如何,这是一个错误。
要解决此问题,您可以: