Получение значения из указателя - PullRequest
2 голосов
/ 04 мая 2010

У меня проблема с получением значения из указателя. У меня есть следующий код в 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) в качестве ссылки в той же функции, просто чтобы убедиться, что значение в порядке, и, как вы можете видеть, FLOAT REFERENCE соответствует NUMBER. Если я объявлю переменную num (чтение массива) как статическое значение с плавающей точкой, первое RESULT_READARRAY будет 65,5, что правильно, однако следующее значение будет таким же, а не 66,5. Позвольте мне показать вам результат выполнения кода с использованием статической переменной с плавающей точкой:

NUMBER 65,5 RESULT_READARRAY 65,5
// ИДЕАЛЬНАЯ ПЛОЩАДКА: 65,5
// ¨PERFECT

НОМЕР 65,5 // ЭТО НЕПРАВИЛЬНО, ЭТО
ДОЛЖНО БЫТЬ 66,5 RESULT_READARRAY 65,5
Плавающая ссылка: 65,5

Знаете ли вы, как я могу получить правильное значение, возвращаемое функцией readArray ()?

Ответы [ 2 ]

4 голосов
/ 04 мая 2010

Вы возвращаете указатель на переменную стека (локальную переменную), которая больше не действительна после выхода из этой функции. Это называется свисающий указатель .

Один обходной путь будет использовать

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

, что приведет к выделению num в куче, что позволит использовать указатель после выхода из функции.

Но лучшим вариантом, например, для приведенного выше примера было бы просто readArray вернуть float и вернуть значение num. Похоже, вы ничего не получите, возвращая указатель сюда.

2 голосов
/ 04 мая 2010

Переменная num была объявлена ​​внутри области видимости в стеке. Как только функция вернула это место в памяти, оно больше не доступно, и, хотя вы, скорее всего, сможете получить к нему доступ, оно (как правило) не будет содержать нужного вам значения. В любом случае это ошибка.

Чтобы исправить это, вы можете:

  • динамически распределяет эту память и освобождает ее позже
  • возвращает само значение, а не указатель
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...