我正在尝试返回浮点值但是当我打印出来时,我得到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的任何想法?对不起,如果这是一个菜鸟问题,我还是比较新的。
答案 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 *
指针可能存储任何内容的地址(只要它的数据,但我不会我想在这里过度复杂化我的答案。)
这可能是你第一次来自哪里。但后来你犯了两个错误:
%f
的{{1}}格式说明符并不指望指针,它需要一个值。有一个名为 dereferencing 的操作是一个指针,用于获取指针指向的值。在c表达式中,您将取消引用运算符写在您的值前面作为星号(printf()
)来执行此操作。
那么如何在不知道类型的情况下读取值呢?你不能!这就是解除引用*
指针的原因是非法的。意思是,即使你没有忘记星号并编写例如void *
,代码也会出错(这次,你的编译器会发现错误)。
话虽如此,c中的printf("%f\n", *(test()));
指针是指泛型指针,因此可以隐式转换为任何其他数据指针类型(注意这是不同的)在c++)。因此,正确编写程序的一种方法是:
void *
编辑:int _tmain(int argc, _TCHAR* argv[]){
float *f = test();
printf("%f\n", *f);
return 0;
}
可以隐式转换为其他数据指针类型,而void *
可能就像这样简单:
test()
edit2:由于您不熟悉指针,添加与您的问题无直接关系的建议:在c的变量声明中,星号绑定< / 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;
}