【问题标题】:Function pointer returning a pointer of some type in C在 C 中返回某种类型的指针的函数指针
【发布时间】:2015-11-09 21:46:34
【问题描述】:

我无法解决下面这段代码。

当我编译包含下面这段代码的整个文件时,我看到一个警告(如下所示),如果从整个 *.c 文件中排除,我看不到它。

代码:

int * ( * get_ptr1)(int) = (int* )0x234456;
printf("The address of the func_ptr is %x\n", get_ptr1);

警告信息:

Initialization from incompatible pointer type

谁能解释一下为什么我会看到这个警告以及上面代码中需要纠正的地方。我正在使用 C99 标准编译器。

如果我的标题不是很具体,请多多包涵。

【问题讨论】:

  • int * ( * get_ptr1)(int) = (int* )0x234456; - 你希望这条线做什么?
  • 我正在尝试为函数指针提供地址 0x234456。我在 linux 内核中看到了这段代码,我试图理解它的功能。如果你能用一些不同的例子来解释我,我将不胜感激。
  • int* (*)(int) 不是int*

标签: c pointers embedded c99


【解决方案1】:

int *int *(*)(int) 是不同的类型。你可以写:

int *(*get_ptr1)(int) = (int *(*)(int))0x234456;

printf 的函数指针没有格式说明符。您对%x 的使用会导致未定义的行为。 See this thread 一些想法。

【讨论】:

  • 关于 printf 问题,也可以选择将函数指针转换为整数类型。
  • @M.M 在标准 C 中,根据 6.3.2.3/6。但它可以调用实现定义的行为,除非你使用uintptr_t
  • @Lundin 好的,尽管它也可能调用 UB(根据 6.3.2.3/6),即使对于 uintptr_t,它也只能保证能够保存对象指针值 (7.20.1.4)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2015-09-12
  • 2012-02-02
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多