【问题标题】:void function pointer return value in CC中的void函数指针返回值
【发布时间】:2014-08-16 06:54:45
【问题描述】:

我在 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 语句中的字符数。为什么会这样?这是预期的输出吗?

【问题讨论】:

  • 您应该提高编译器的警告级别:ideone.com/3DQN40
  • 未定义行为没有“预期输出”。
  • 我使用 gcc -Wall 确实给了我一个警告,但我很好奇为什么会发生这种行为
  • 你可以得到任何东西。随机的。它可能恰好提供了 printf 的返回,因为这是函数返回时累加器中剩下的东西(printf 是最后一个调用的东西,它确实有一个返回值)。但不能保证。你不能指望它。那么是预期的吗?不,这可以解释吗?是的。
  • 查看通话前后的a 是什么。应该是一样的。

标签: c function-pointers void


【解决方案1】:

这是预期的结果! printf() 函数将返回打印的字符数。在这种情况下,fptr(2,3) 将打印2,3 AND \n,因此它返回4

【讨论】:

    【解决方案2】:

    这是未定义的行为,因此,任何行为都“符合规范”,包括"Nasal Demons"

    但是,我们可以解释为什么这可能在许多现代平台上发生。

    返回值的最后一个函数的返回值通常放在CPU的AX寄存器中。

    printf 是最后一个有返回值的函数,并将4 放入 AX 寄存器中。
    在此期间,没有其他东西重写 AX 寄存器,变量a 获得“返回值”(即使fptr 没有返回值!),通过获取AX 寄存器,仍然是4

    【讨论】:

    • TIL printf 返回一个值。
    • 我不明白为什么AX寄存器中有4。这是一个案例还是可以由其他人重新创建?
    • @neo_blackcap: printf 有一个返回值。 printf 记录了 “成功时,返回写入的字符总数。”。所以它返回它成功打印了 4 个字符。
    猜你喜欢
    • 2012-02-26
    • 2020-06-11
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2018-04-19
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多