我正在玩C中的函数指针只是为了学习。我尝试调用void函数并将其结果设置为int。
void function(int x, int y){
printf("%d,%d\n",x,y);
}
int main(){
int (*fptr)(int,int);
fptr = function;
int a = fptr(2,3);
printf("%d\n",a);
return 0;
}
我得到的输出是:
2,3
4
稍微玩了一下后,我意识到main是在function()中打印printf语句中的字符数。为什么会这样?这是预期的产出吗?
答案 0 :(得分:6)
这是未定义的行为,因此,任何行为都是"在规范"中,包括"Nasal Demons"
但是,我们可以解释为什么在许多现代平台上发生可能。
具有返回值的最后一个函数的返回值通常放在CPU的 AX 寄存器中。
printf
是最后一个具有返回值的函数,并将4
放入 AX 寄存器。
在此期间,没有其他任何东西覆盖 AX 寄存器,变量a
获得"返回值" (即使fptr
没有返回值!),通过获取 AX 寄存器的内容,该寄存器仍为4
。
答案 1 :(得分:0)
这是预期的结果!
printf()
函数将返回打印的字符数。在这种情况下,fptr(2,3)
将打印2,3
AND \n
,因此返回{{ 1}}