Преобразование double в void * в C

Я пишу интерпретатор, и я хотел бы иметь возможность хранить любое значение, возвращаемое функцией в указатель void. У меня не было проблем с хранением ints и различных указателей как указателей void, но я получаю сообщение об ошибке при попытке использовать double как указатель void. Я понимаю, что двойники хранятся по-разному, чем целые и указатели на уровне бит, но я не понимаю, почему я не могу поместить любые биты, которые я хочу в указатель (при условии, что у него достаточно выделенной памяти), а затем вывести их позже, бросая их как двойной.

Можно ли использовать двойное значение для указателя void с использованием синтаксиса, о котором я не знаю, или я не понимаю, как работают указатели void?

Во многих системах double имеет ширину 8 байтов, а указатель имеет ширину 4 байта. Следовательно, первая не впишется в последнюю.

Вы, кажется, злоупотребляете void* . Ваше решение будет включать выделение пространства для хранения, по крайней мере, такого большого, как самый большой тип, который вам нужно хранить в некоторой разновидности, например, в union .

Конечно, его можно бросить. Указатели Void – это то, что делает polymorphism возможным в C. Вам нужно заранее знать, что вы передаете своей функции.

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

Вот

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

выход

 1.000000 0x7fff89a7de80 0x7fff89a7de80 0x3ff0000000000000 

Второй и третий адреса могут отличаться. Ярлык

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

ура