2011-07-04 52 views
6

我正在编写一个解释器,我希望能够将函数返回的任何值存储到一个空指针中。我没有问题存储整数和各种指针作为无效指针,但当我试图将一个双精度指针作为void指针时出现错误。我知道双精度数据的存储方式与位级的整数和指针不同,但我不明白为什么我不能在指针中放置任何我想要的位(假设它已经分配了足够的内存),然后再取出它们,将它们铸成双层。在C中将double转换为void *

是否有可能使用语法将一个double转换为void指针我不知道或者我误解了void指针的工作原理?

+4

有你使用'union',而不是考虑? –

+4

这听起来像你正在做一些可怕的错误。请看David的回答。 – pmr

+0

检查我在这个问题的答案http://stackoverflow.com/questions/6539023/storing-values-in-union-in-c/6539185#6539185 –

回答

12

在许多系统上,一个double是8个字节宽,一个指针是4个字节宽。因此,前者不适合后者。

您似乎在滥用void*。您的解决方案将涉及分配至少与您需要以某种类似变体结构存储的最大类型一样大的存储空间,例如,一个union

+2

我不能相信我从来没有听说过工会之前。这正是我所期待的。 – Jack

+1

+1表示正确的方法。 :) –

2

当然可以施放它。无效指针是使C中的多态性成为可能的原因。您需要事先知道您传递给函数的内容。

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

你的例子似乎工作,因为'p_d'是一个指针。操作系统询问一个非指针void *转换。 – 2016-03-03 20:06:31

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 ; 

干杯

+0

这是未定义的行为(严格别名违规) –

+0

@ M.M它不是。我投了指针,我知道我在做什么,它不是C++,它编译并提供正确的输出。我不会建议在长码中使用这种技术,但我是对的。 – Fabio

+0

表达式'* p'具有'void *'类型,但是正在访问实际上是'double *'类型的内存。这些甚至可能是不同的大小 –

相关问题