C语言 下面的代码的输出是什么,它是如何工作的?

0sgqnhkj  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(116)
#include <stdio.h>

void fun(int a, float b)
{
    int c;
    c = a + b;
    printf("Value ----- c %d", c);
}

int main()
{
   void (*foo) (int, int) = &fun;

   (*foo)(3,2);
    return 0;
}

我只是想知道这个代码流是如何工作的。上面的代码打印3作为输出我不确定它是如何工作的

u4dcyp6a

u4dcyp6a1#

您的程序通过使用具有不兼容类型的指针来调用函数,从而调用了 * 未定义行为 *。(指针void (*)(int, int)用于调用函数void fun(int a, float b),第二个参数的类型不同)
这种特殊结果的原因 * 可能是 * 你使用的调用约定,浮点参数以不同的方式传递(例如不同的寄存器)而不是整数参数,并且在这样的区域中碰巧有零或一些小值来传递浮点值。

iibxawm4

iibxawm42#

该代码表现出未定义的行为,源于将void (*)(int, float)分配给void (*)(int, int)
这意味着程序可以自由地做任何它想做的事情。输出可能是64,SIGSEGV,或者删除你的硬盘。没有办法知道。
总是启用编译器的警告。它会捕捉到这个错误。使用gcc,你可以使用-Wall -Wextra -pedantic -Werror

相关问题