繁体   English   中英

如何将int *转换为int(* p)(void)?

[英]How do I convert int* to int (*p)(void)?

我试着这样做:

int (*p)(void);
int *i;
...
p = (int *(void))i;

但它导致语法错误:

error: cast specifies function type

这有什么不对?

在这种情况下你应该尊重错误。 您不能将指向函数的指针转换为int指针或其他方式。 这可能会导致未定义的行为。

如果你坚持的话,语法应该是:

p = (int (*)(void))i;

我是一个指向整数的指针,p是一个函数指针返回和int并且不带参数。 它们不以任何方式,形状或形式兼容/浇铸。

编译器说的是什么。 int (*p)(void)是一个函数指针声明(指向返回int的函数的指针)。 int *i; 是一个标量指针声明(指向int的指针)。 你不能把一个投入另一个。

如果你必须这样做(我不会说你应该这样做)那么:

typedef int (*fp)(void);
int *i;
fp p;
...
p = (fp)((void*)i);

p = (int (*)(void))i;

这是一个例子:

#include <stdio.h>

int f(){
    printf("test\n");
    return 0;
}

int main()
{
    int (*p)(void);
    int *i;

    i = (int*)f;

    p = (int (*)(void))i;

    printf("i=%p\n", i);
    printf("p=%p\n", p);

    ((int (*)(void))i)(); //here, it will call f()

    return 0;
}

*i指向一个简单的整数,而*p是指向函数的指针,没有参数返回整数。 因此,这两个类型完全不同,因为你说p应该指向一个返回int的函数,你不能告诉它指向一个int。

但是,您可以尝试将两者都包装在一个联合中,如下所示:

union u {
  int *i;
  int (*p)(void);
};

int f(void){
  return 5;
}

int main(int argc, char *argv[]) {
  union u myU;
  int a=6;
  myU.i=&a;
  myU.p=&f;
  return 0;
}

请注意,在分配&f ,您只需调用myU.p() 但是如果省略&f的赋值并在之后调用myU.p() ,则会导致未定义的行为(即程序崩溃)。

你没有。 也就是说,除非你比编译器更了解存储在int *中的指针首先来自int (*p)(void) 正如其他人所说,第二种类型是一个指向函数的指针,该函数不带参数并返回一个int。 第一种类型是指向整数的简单指针(如果被视为数组,则为多于一个整数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM