在linux下,c函数有疯狂行为

时间:2016-04-17 18:52:03

标签: c function

我有一个行为不正确的c函数,我从来没有见过这样的东西也许有人可以启发我这个完整的谜团

所以在test.c中,函数是:

float wtf(int c)
{
    return 0.0;
}

在main.c中

float a=wtf(0);
float b=wtf(2);
float c=wtf(3);
float d=wtf(4);
printf("%f %f %f %f\n",a,b,c,d);

结果:

0.000000 2.000000 3.000000 4.000000

现在为什么参数以某种方式输出应该输出0的函数?

这是我在linux下编译它的方法

cc -std=c99 -I"/usr/include/pd" -DPD -DVERSION='"0.0"' -fPIC -O6 -funroll-loops -fomit-frame-pointer  -Wall -W -g -o "main.o" -c "main.c" -lpng -lbcm2835 -Wno-unused-parameter -Wno-implicit-function-declaration -Wno-unused-variable -Wno-unused-but-set-variable -Wno-comment -lc
有人可以帮帮我吗? 问候

1 个答案:

答案 0 :(得分:4)

您似乎错过了编译器的-Wall参数。有了它,你会看到如下信息:

main.c:3:1: warning: implicit declaration of function ‘wtf’ [-Wimplicit-function-declaration]

哪种排序告诉你问题 - 如果你在尝试调用它之前没有在编译单元中声明一个函数,编译器将假定它返回int - 并且在这种情况下,看起来int返回值恰好存储在与第一个参数相同的位置(可能是某个特定的整数寄存器)。因此,如果获得函数实际尝试返回的返回值(可能在浮点寄存器中),它会将int转换为浮动,如您所见。