#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作为输出我不确定它是如何工作的
u4dcyp6a1#
您的程序通过使用具有不兼容类型的指针来调用函数,从而调用了 * 未定义行为 *。(指针void (*)(int, int)用于调用函数void fun(int a, float b),第二个参数的类型不同)这种特殊结果的原因 * 可能是 * 你使用的调用约定,浮点参数以不同的方式传递(例如不同的寄存器)而不是整数参数,并且在这样的区域中碰巧有零或一些小值来传递浮点值。
void (*)(int, int)
void fun(int a, float b)
iibxawm42#
该代码表现出未定义的行为,源于将void (*)(int, float)分配给void (*)(int, int)。这意味着程序可以自由地做任何它想做的事情。输出可能是64,SIGSEGV,或者删除你的硬盘。没有办法知道。总是启用编译器的警告。它会捕捉到这个错误。使用gcc,你可以使用-Wall -Wextra -pedantic -Werror。
void (*)(int, float)
-Wall -Wextra -pedantic -Werror
2条答案
按热度按时间u4dcyp6a1#
您的程序通过使用具有不兼容类型的指针来调用函数,从而调用了 * 未定义行为 *。(指针
void (*)(int, int)
用于调用函数void fun(int a, float b)
,第二个参数的类型不同)这种特殊结果的原因 * 可能是 * 你使用的调用约定,浮点参数以不同的方式传递(例如不同的寄存器)而不是整数参数,并且在这样的区域中碰巧有零或一些小值来传递浮点值。
iibxawm42#
该代码表现出未定义的行为,源于将
void (*)(int, float)
分配给void (*)(int, int)
。这意味着程序可以自由地做任何它想做的事情。输出可能是64,SIGSEGV,或者删除你的硬盘。没有办法知道。
总是启用编译器的警告。它会捕捉到这个错误。使用gcc,你可以使用
-Wall -Wextra -pedantic -Werror
。