我如何在C中强制转换void函数指针?

问题描述 投票:0回答:4

考虑:

#include <stdio.h>

int f() {
  return 20;
}

int main() {
    void (*blah)() = f;

    printf("%d\n",*((int *)blah())());  // Error is here! I need help!
    return 0;
}

我想将'blah'强制转换回(int *),以便我可以将其用作在printf语句中返回20的函数,但它似乎不起作用。我该如何解决?

c function pointers casting void
4个回答
3
投票

怎么样?

printf("%d\n",((int (*)())blah)() ); 

3
投票

您的代码似乎正在执行的操作是调用blah指向的函数,然后尝试将其void返回值强制转换为int *,这当然是不可以的。

您需要在调用函数之前强制转换函数指针。在单独的语句中执行此操作可能更清晰,但是您可以根据需要在printf调用中执行此操作:

printf( "%d\n" , ((int (*)())blah)() );

1
投票

而不是初始化一个void指针并在以后重铸,请立即将它初始化为一个int指针(因为您已经知道它是一个int函数):

int (*blah)() = &f; // I believe the ampersand is optional here

要在代码中使用它,您只需像这样调用它:

printf("%d\n", (*blah)());

0
投票

typedef int版本:

typedef int (*foo)();

void (*blah)() = f;
foo qqq = (foo)(f);

编辑:哎呀,忘记提供打印说明了>>

printf("%d\n", qqq());
© www.soinside.com 2019 - 2024. All rights reserved.