C为什么void指针不能存储浮点值?

时间:2015-07-29 20:03:20

标签: c pointers

我正在尝试返回浮点值但是当我打印出来时,我得到0.0。

float floating = 4.5;

void* function(){
    void* test = &floating;
    return test;
}

int _tmain(int argc, _TCHAR* argv[]){
     printf("%f\n", test());
     return 0;
}

有关为什么不打印4.5的任何想法?对不起,如果这是一个菜鸟问题,我还是比较新的。

7 个答案:

答案 0 :(得分:9)

假设您的function() 实际拼写test()%f需要float值。您正在提供void *。这是错误的undefined behaviour

解决方案:void是一个不完整的类型,您不能直接取消引用void指针。在解除引用之前,需要将指针强制转换为所需类型。例如,

printf("%f\n", *( (float *) test() ) );

答案 1 :(得分:5)

尝试

printf("%f\n", *( (float*)function() ));

答案 2 :(得分:5)

尝试提供更多详细信息:

首先,从你如何处理你的问题,你应该理解指针不存储值,它们存储对象的地址。 void根本不是类型,void *指针可能存储任何内容的地址(只要它的数据,但我不会我想在这里过度复杂化我的答案。)

这可能是你第一次来自哪里。但后来你犯了两个错误:

  1. %f的{​​{1}}格式说明符并不指望指针,它需要一个值。有一个名为 dereferencing 的操作是一个指针,用于获取指针指向的值。在表达式中,您将取消引用运算符写在您的值前面作为星号(printf())来执行此操作。

  2. 那么如何在不知道类型的情况下读取值呢?你不能!这就是解除引用*指针的原因是非法的。意思是,即使你没有忘记星号并编写例如void *,代码也会出错(这次,你的编译器会发现错误)。

  3. 话虽如此,中的printf("%f\n", *(test()));指针是指泛型指针,因此可以隐式转换为任何其他数据指针类型(注意这是不同的)在)。因此,正确编写程序的一种方法是:

    void *

    编辑int _tmain(int argc, _TCHAR* argv[]){ float *f = test(); printf("%f\n", *f); return 0; } 可以隐式转换为其他数据指针类型,而void *可能就像这样简单:

    test()

    edit2:由于您不熟悉指针,添加与您的问题无直接关系的建议:在的变量声明中,星号绑定< / em>到标识符(变量名),而不是类型。这意味着您将void *test() { return &floating; } 读作&#34; foo是指向int &#34;的类型的变量。但是&#34; foo是 int &#34;类型的指针变量。这在撰写时具有严重的意义,例如int * foo; - foo将是一个指针,禁止正常变量。因此,建议是:通过书写例如明确int * foo, bar;代替void *test

答案 3 :(得分:4)

printf看到的是参数值。该值不是浮点数,而是指向浮点数的指针。您需要将其强制转换为浮动*并取消引用它。

答案 4 :(得分:2)

我在我的IDE中测试过。 function()是正确的,您需要修改的是printf()。我的回答:

#include <stdio.h>
float floating = 4.5;

void* test(){
    void* test = &floating;
    return test;
}

int main()
{

    printf("%f\n", *(float *)test());  //modify here
    return 0;
}

我希望这可以帮到你。

答案 5 :(得分:1)

%f转换说明符期望它的对应参数具有类型float;你传递的是void *,因此是垃圾输出。

将其更改为

printf( "%f\n", * ((float *) test()) );

您必须将从void *返回的test转换为float *,然后取消引用结果以获取实际的float值。演员是必要的,因为你不能直接推理void *

答案 6 :(得分:0)

你不打印4.5,因为你在变量上返回一个指针&#34;浮动&#34;不是变量本身。

您必须将代码更改为:

int _tmain(int argc, _TCHAR* argv[]){
     printf("%f\n", (*(float*)function()));
     return 0;
}