6
votes

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 integers 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?

3
have you considered using a union instead ? - Andre Holzner
It sounds like you are doing something horribly wrong. Please look at David's answer. - pmr
check my answer in this other question stackoverflow.com/questions/6539023/… - Vinicius Kamakura

3 Answers

15
votes

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.

3
votes

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 ;
-2
votes

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