J'ai une valeur que je reçois dans un tableau d'octets non signé que je souhaite déréférencer comme un flottant. Prenez ptr comme uint8_t * pointant sur un tableau d'octets de quatre valeurs 0,0,0xCD, 0x42 (c'est un petit système endian).Pointeur de déréférencement dans Code Composer Studio
float val = *(float*)ptr;
est retour -1.34e8
Quand je tape:
*(float*)ptr;
Dans la fenêtre des expressions après avoir atteint un point de rupture dans cette partie du code, il me donne 102,5 comme prévu. De plus, quand je tape:
*(float*)(ptr - 1);
je reçois le -1.34e8 incorrect, comme si le compilateur utilisé PTR - 1 au lieu de ce que je tapais.
Je suis confus - ai-je oublié quelque chose ici?
Fondamentalement, le deref est correct. si vous printf ("% p", ptr); avez-vous une adresse qui n'est peut-être pas alignée sur 4 octets (ou au moins sur 2 octets)? (Cela peut être nécessaire sur certaines plates-formes). Et btw, (ptr-1) est un octet de retour (parce que c'est un uint8_t *), pas l'habituel retour en arrière d'une taille float. – QSQ
Oui c'est la chose étrange. ptr - 1 est un octet de retour, donc c'est comme si mon code original * (float *) ptr; regarde un octet en arrière et interprète les quatre octets flottants à partir de là au lieu de ptr. Mon point était que lorsque le code a été arrêté dans le débogueur, * (float *) ptr me donne ce que je m'attendais à obtenir à l'exécution, et * (float *) (ptr-1) me donne ce que j'ai réellement obtenu à l'exécution. – ace
peut-être que le compilateur arrondit la valeur ptr s'il n'est pas aligné correctement. essayez printf ("% p", ptr); dans la source, puis vérifiez si le résultat est le même que celui que le débogueur vous donne (il suffit d'imprimer le pointeur lui-même dans le dbg). – QSQ