Converting double to void* in C
I'm writing an interpreter and I'd like to be able to store whatever value a function returns into a void pointer. I've had no problem storing ints and various pointers as void pointers but I get an error when trying to cast a double as a void pointer. I understand that doubles are stored differently than inte开发者_运维百科gers and pointers at the bit level, but I don't understand why I can't place whatever bits I want into the pointer (assuming it has enough memory allocated) and then take them out later, casting them as a double.
Is it possible to cast a double to a void pointer using syntax I'm not aware of or am I misunderstanding how void pointers work?
On many systems a double
is 8 bytes wide and a pointer is 4 bytes wide. The former, therefore, would not fit into the latter.
You would appear to be abusing void*
. Your solution is going to involve allocating storage space at least as big as the largest type you need to store in some variant-like structure, e.g. a union
.
Of course it's possible to cast it. Void pointers is what makes polymorphism possible in C. You need to know ahead of time what you're passing to your function.
void *p_v ;
double *p_d ;
p_d = malloc( sizeof( double ) ) ;
p_v = ( void * ) p_d ;
continue with Fabio. and make sure you are running on x64
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);
printf("%d %f\n", dp, *(double*)p);
printf("%f\n", *(double*)(void **)&d);
}
output
1.000000 0000000353F1FA30 0000000353F1FA30 3FF0000000000000
0 1.000000
1.000000
Here is it
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 ;
} ;
output
1.000000 0x7fff89a7de80 0x7fff89a7de80 0x3ff0000000000000
2nd and 3rd addresses could be different. A shortcut
void * dp = * ( void * * ) & d ;
Cheers
精彩评论