从指针获取价值

时间:2010-05-04 16:31:38

标签: c++ pointers

我在从指针获取值时遇到问题。我在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 = &num;  
    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()的函数返回的正确值吗?

2 个答案:

答案 0 :(得分:4)

您正在返回指向堆栈变量(局部变量)的指针,该函数在您离开该函数后不再有效。它被称为dangling pointer

一种解决方法是使用

float *num = new float(bit.getFloatFromArray(arregloTemp); 
// ...
return (void*)num;

会强制num在堆上分配,允许在函数退出后使用指针。

但对于上面的示例,更好的选择是让readArray返回float并返回num的值。你似乎没有通过在这里返回指针获得任何东西。

答案 1 :(得分:2)

num变量在堆栈内的范围内声明。一旦函数返回该内存位置不再可用,虽然您很可能能够访问它,但它(通常)不会保留您需要的值。无论如何,这是一个错误。

要解决此问题,您可以:

  • 动态分配该内存,稍后在
  • 上发布
  • 返回值本身,而不是指针