2010-05-04 7 views
2

Je n'arrive pas à obtenir la valeur d'un pointeur. Je le code suivant dans C++:Obtention d'une valeur à partir du pointeur

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; 
} 

Le résultat de l'exécution de ce code est le suivant:

NUMÉRO 65,5 RESULT_READARRAY -1,2001
// INCORRECT IL ÊTRE COMME NUMÉRO DE RÉFÉRENCE
FLOAT : 65,5 // CORRECT

NUMÉRO 66,5 RESULT_READARRAY -1,2001
// INCORRECT IL ÊTRE COMME NOMBRE
FLOAT RÉFÉRENCE: 66,5 // CORRECT

Pour une raison quelconque, quand je reçois la valeur du pointeur retourné par la fonction appelée ReadArray est incorrecte. Je passe une variable float (d) comme référence dans la même fonction juste pour vérifier que la valeur est ok, et comme vous pouvez le voir, THE FLOAT REFERENCE correspond au NUMBER. Si je déclare la variable num (array lu) comme un flottant statique, le premier RESULT_READARRAY sera 65.5, c'est correct, cependant, la valeur suivante sera la même au lieu de 66.5. Permettez-moi de vous montrer le résultat de l'exécution du code en utilisant la variable float statique:

NUMÉRO 65,5 RESULT_READARRAY 65,5
// PERFECT FLOAT RÉFÉRENCE: 65,5
// PERFECT

NUMÉRO 65,5 // C'EST INCORRECT, IT
DEVRAIT ÊTRE 66,5 RESULT_READARRAY 65,5
FLOAT RÉFÉRENCE: 65,5

savez-vous comment puis-je ge t la valeur correcte renvoyée par la fonction appelée readArray()?

Répondre

4

Vous renvoyez un pointeur vers une variable de pile (une variable locale), qui n'est plus valide une fois que vous quittez cette fonction. C'est ce qu'on appelle un dangling pointer.

Une solution serait d'utiliser

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

qui forcerait num à allouer sur le tas, ce qui permet le pointeur à utiliser après la sortie de fonction.

Mais la meilleure option, pour l'exemple ci-dessus, serait d'avoir simplement readArray retourner un float et retourner la valeur de num. Vous ne semblez rien gagner en retournant un pointeur ici.

+0

+1 Grande solution de contournement, que est ce que je cherchais: D Merci Mark – Eric

2

La variable num a été déclarée dans la portée, dans la pile. Une fois que la fonction est retournée, cet emplacement de mémoire n'est plus disponible, et même si vous serez probablement en mesure d'y accéder, il (généralement) ne contiendra pas la valeur dont vous avez besoin. En tout cas c'est un bug.

Pour résoudre ce problème, vous pouvez:

  • allouer dynamiquement la mémoire et le libérer plus tard
  • retour la valeur elle-même, et non un pointeur
+0

+1 pour mentionner "retourner la valeur elle-même". Cela semble être une approche naturelle dans ce cas. – a1ex07

Questions connexes