我正在编写一个解释器,我希望能够将函数返回的任何值存储到void指针中。我没有问题存储int和各种指针作为void指针,但我在尝试将double作为void指针进行转换时遇到错误。据我所知,双精度存储的位置与位级别的整数和指针不同,但我不明白为什么我不能将任何我想要的位放入指针(假设它有足够的内存分配),然后将它们取出,把它们当成双人。
是否可以使用我不知道的语法将double转换为void指针,或者我是否误解了void指针的工作原理?
答案 0 :(得分:12)
在许多系统上,double
为8字节宽,指针为4字节宽。因此,前者不适合后者。
您似乎在滥用void*
。您的解决方案将涉及分配存储空间,该存储空间至少与您需要存储在某些类似变体的结构中的最大类型一样大,例如, union
。
答案 1 :(得分:2)
当然可以施展它。无效指针是使C中的多态性成为可能的原因。您需要提前知道您传递给函数的内容。
void *p_v ;
double *p_d ;
p_d = malloc( sizeof( double ) ) ;
p_v = ( void * ) p_d ;
答案 2 :(得分:0)
这是
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 ;
干杯