【问题标题】:Getting value from pointer从指针中获取值
【发布时间】:2010-05-05 00:38:25
【问题描述】:

我在从指针中获取值时遇到问题。我在 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)作为参考,只是为了验证该值是否正常,如您所见,浮点参考与数字匹配。如果我将变量 num(read array) 声明为静态浮点数,则第一个 RESULT_READARRAY 将为 65.5,这是正确的,但是,下一个值将是相同的,而不是 66.5。让我向您展示使用静态浮点变量运行代码的结果:

NUMBER 65.5 RESULT_READARRAY 65.5
//完美的浮点参考:65.5
//¨完美

NUMBER 65.5 //这是不正确的,它
应该是 66.5 RESULT_READARRAY 65.5
浮点参考:65.5

你知道我怎样才能得到 readArray() 函数返回的正确值吗?

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

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

    一种解决方法是使用

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

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

    但对于上面的示例,更好的选择是让readArray 返回一个float 并返回num 的值。在这里返回指针似乎没有任何收获。

    【讨论】:

    • +1 很好的解决方法,这就是我想要的:D 谢谢马克
    【解决方案2】:

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

    要解决此问题,您可以:

    • 动态分配内存,稍后释放
    • 返回值本身,而不是指针

    【讨论】:

    • +1 用于提及“返回值本身”。在这种情况下,这似乎是一种自然的方法。
    猜你喜欢
    • 2021-01-07
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多