Conversion double en annulation * en C

J’écris un interprète et j’aimerais pouvoir stocker la valeur renvoyée par une fonction dans un pointeur vide. Je n’ai eu aucun problème à stocker les ints et divers pointeurs en tant que pointeurs vides, mais j’obtiens une erreur en essayant de transformer un double en pointeur vide. Je comprends que les doubles sont stockés différemment des entiers et des pointeurs au niveau des bits, mais je ne comprends pas pourquoi je ne peux pas placer les bits que je veux dans le pointeur (en supposant qu’il y ait assez de mémoire allouée) et les extraire ensuite, les jeter comme un double.

Est-il possible de transtyper un double sur un pointeur vide en utilisant une syntaxe dont je ne suis pas au courant ou qui ne comprend pas comment fonctionnent les pointeurs vides?

Sur de nombreux systèmes, un double une largeur de 8 octets et un pointeur, une largeur de 4 octets. Les premiers ne s’intégreraient donc pas dans les seconds.

Vous sembleriez abuser de void* . Votre solution impliquera d’allouer un espace de stockage au moins égal au type le plus volumineux que vous devez stocker dans une structure de type variante, par exemple une union .

Bien sûr, il est possible de le lancer. Les pointeurs nuls sont ce qui rend le polymorphism possible en C. Vous devez savoir à l’avance ce que vous transmettez à votre fonction.

 void *p_v ; double *p_d ; p_d = malloc( sizeof( double ) ) ; p_v = ( void * ) p_d ; 

La voici

 int main ( ) { double d = 1.00e+00 ; // 0x3ff0000000000000 double * pd = & d ; void * * p = ( void * * ) pd ; void * dp = * p ; printf ( "%f %p %p %p \n" , d , pd , p , dp ) ; return 0 ; } ; 

sortie

 1.000000 0x7fff89a7de80 0x7fff89a7de80 0x3ff0000000000000 

Les 2ème et 3ème adresses peuvent être différentes. Un raccourci

 void * dp = * ( void * * ) & d ; 

À votre santé