gpt4 book ai didi

c - 传递 float 作为参数搞砸了值

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:13 24 4
gpt4 key购买 nike

在我的 main 函数中,我使用以下代码

float f = 32.0;
func("test string %f", f);

func(这些都是示例名称)声明如下

void func(const char *str, ...);

在我实现这个函数时,我使用一个名为 all_types 的 union 来获取传递的参数的值

union all_types
{
void *v;
CLObject *obj;
char *s;
long l;
char c;
float f;
int i;
double d;
};

然后像这样给那个 union 赋值

union all_types *o = calloc(1, sizeof(union all_types));
while ((o->v = va_arg(list, void *)) != NULL)

现在,当我知道参数是一个 float 时,它的值会很奇怪(我设置了一个断点来弄清楚)。并集上的 il 值应该是 32。但是,f 值是一些奇怪的数字,例如 0.00000000000000000000000000000000000000000013592595。有谁知道我为什么会出现这种行为?此函数适用于我测试过的所有其他类型的对象。

最佳答案

va_arg 宏的第二个参数是实际参数的实际类型。 va_arg 调用不会发生任何转换。如果您不知道实际参数的实际类型,那您就不走运了,因为无法找出答案。

请注意,默认参数转换确实发生在调用本身,因此不可能接收到 floatcharunsigned short . (float 将转换为 double,其他两个转换为 intunsigned int,具体取决于。)

这就是为什么 printf 格式让您指定参数的类型,float 除外。

关于c - 传递 float 作为参数搞砸了值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21770602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com