2010-05-04 172 views
2

我有问题从指针获取值。我在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
//不正确应该像NUMBER
FLOAT参考:65.5 //正确

NUMBER 66.5 RESULT_READARRAY -1.2001
//不正确应该像NUMBER
FLOAT REFERENCE:66.5 // CORRECT

由于某些原因,当我得到由名为readArray的函数返回的指针值不正确时。我在同一个函数中传递一个浮点变量(d)作为参考,以验证该值是否正确,正如您所见,FLOAT REFERENCE与NUMBER匹配。如果我将变量num(读数组)声明为静态浮点数,则第一个RESULT_READARRAY将是65.5,这是正确的,但是,下一个值将是相同的,而不是66.5。让我告诉你使用静态浮动变量运行代码的结果:

NUMBER 65.5 RESULT_READARRAY 65.5
// PERFECT FLOAT参考:65.5
//完美

NUMBER 65.5 //这是错误的时候,
应该是66.5 RESULT_READARRAY 65.5
FLOAT参考:65.5

你知道我怎么能GE t由readArray()函数返回的正确值?

回答

4

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

一种解决方法是使用

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

这将迫使num要在堆上分配,允许指针函数退出后使用。

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

+0

+1大的解决方法,即是我在找的东西:D 感谢马克 – Eric 2010-05-04 16:46:42

2

num变量是在作用域内的堆栈中声明的。一旦函数返回后,内存位置不再可用,并且尽管您很可能会访问它,但它(通常)将不会保存您需要的值。无论如何,这是一个错误。

为了解决这个问题,您可以:

  • 动态分配内存,后来释放它
  • 返回值本身,而不是一个指针
+0

+1提到“返回价值本身”。在这种情况下,这似乎是一种自然的做法。 – a1ex07 2010-05-04 16:37:26