您可以将“函数指针指向指针”转换为void *

pa

通过评论我的回答启发这里

此步骤顺序在C标准(C11)中合法吗?

  1. 制作一个函数指针数组
  2. 一个指针指向的第一项和铸造的指针函数指针void*
  3. 对它执行指针算术 void*
  4. 将其转换回函数指针的指针并取消引用。

或等效地作为代码:

void foo(void) { ... }
void bar(void) { ... }

typedef void (*voidfunc)(void);
voidfunc array[] = {foo, bar}; // Step 1

void *ptr1 = array; // Step 2

void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3

voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4

我认为这将被允许,因为实际的函数指针只能通过正确键入的指针来访问。但是安德鲁·亨利(Andrew Henle)指出,标准6.3.2.3:指针似乎并未涵盖这一点

伦丁

是的,代码很好。这里有各种陷阱和转换规则:

  • C将所有类型分为两个主要类别:对象和函数。指向函数的指针是标量类型,而标量类型又是对象。(C17 6.2.5)
  • void*是指向对象类型的指针的通用指针类型。指向对象类型的任何指针都可以void*隐式地转换为from / from (C17 6.3.2.3§1)。
  • 对于函数类型的指针,不存在此类通用指针类型。因此,函数指针不能转换为a void*,反之亦然。(C17 6.3.2.3§1)
  • 但是,任何函数指针类型都可以转换为另一种函数指针类型,然后再转换回去,这使我们可以使用诸如void(*)(void)通用函数指针类型之类的东西。只要您不通过错误的函数指针类型调用函数,就可以了。(C17 6.3.2.3§8)

函数指针指向函数,但它们本身就是对象,就像任何指针一样。因此,您可以使用avoid*指向函数指针的地址

因此,使用avoid*指向函数指针就可以了。但是不能用它直接指向一个函数。如果void *ptr1 = array;数组衰减为指向第一个元素的指针,则a void (**)(void)(相当于voidfunc*您的示例)。您可以使用指向此类指向函数指针的指针void*

此外,关于指针算法:

  • 无法在上执行指针算术运算void*(C17 6.3.2.2)这种算术运算是应避免的常见非标准扩展。而是使用指向字符类型的指针。
  • 在特殊情况下,可以使用指向字符类型的指针来迭代任何对象(C17 6.2.3.3§7)。除了有关对齐的问题外,如果您取消引用字符指针(C17 6.5§7),这样做是明确定义的,并且不违反“严格指针别名”。

因此,(char*)ptr1 + sizeof(voidfunc);也可以。然后您从转换void*voidfunc*voidfunc这是数组中存储的原始函数指针类型。

如注释中所述,可以通过typedef对函数类型使用a显着提高此代码的可读性

typedef void (voidfunc)(void);

voidfunc* array[] = {&foo, &bar}; // Step 1
void* ptr1 = array; // Step 2
void* ptr2 = (char*)ptr1 + sizeof(voidfunc*); // Step 3
voidfunc* bar_ptr = *(voidfunc**)ptr2; // Step 4

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

来自分类Dev

C-将指针转换为指向void的指针

来自分类Dev

将指针转换为指针...指向指针?

来自分类Dev

如何将void指针强制转换为函数指针

来自分类Dev

将指针转换为void

来自分类Dev

将函数转换为通用 void 指针作为函数参数

来自分类Dev

指向void函数的指针

来自分类Dev

将“指向const的指针”转换为“指向const VLA的指针”

来自分类Dev

将指向函数的指针存储在void *中

来自分类Dev

是否可以将Swift类转换为C void *指针?

来自分类Dev

函数指针将参数强制转换为 void

来自分类Dev

为什么在将 void 指针转换为指向 char 指针的指针后取消引用会产生问题?

来自分类Dev

指向函数转换的指针

来自分类Dev

将指向成员的指针类型转换为简单的指针类型

来自分类Dev

可以在函数调用期间将指针转换为数组吗?

来自分类Dev

将false转换为指针类型void *?

来自分类Dev

将 void 指针转换为动态类型

来自分类Dev

我可以合法地将指向结构成员的指针转换为指向该结构的指针吗?

来自分类Dev

指向void *函数的指针C ++

来自分类Dev

将javascript Max函数包装器转换为指向Math.Max的函数指针

来自分类Dev

将函数指针转换为noexcept指定的函数指针

来自分类Dev

是否可以将struct指针转换为c中的函数指针?

来自分类Dev

将*指针转换为***指针

来自分类Dev

您可以从C中当前指向的函数中更改指向函数的指针吗?

来自分类Dev

当您可以直接将变量作为指针指向时,为什么要在C中创建指针?

来自分类Dev

在C中是否可以将指针转换为双指针?

来自分类Dev

将转发lambda转换为函数指针

来自分类Dev

将Shellcode转换为函数指针

来自分类Dev

如何将类型为void(*)()的指针转换为void *

Related 相关文章

  1. 1

    为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

  2. 2

    C-将指针转换为指向void的指针

  3. 3

    将指针转换为指针...指向指针?

  4. 4

    如何将void指针强制转换为函数指针

  5. 5

    将指针转换为void

  6. 6

    将函数转换为通用 void 指针作为函数参数

  7. 7

    指向void函数的指针

  8. 8

    将“指向const的指针”转换为“指向const VLA的指针”

  9. 9

    将指向函数的指针存储在void *中

  10. 10

    是否可以将Swift类转换为C void *指针?

  11. 11

    函数指针将参数强制转换为 void

  12. 12

    为什么在将 void 指针转换为指向 char 指针的指针后取消引用会产生问题?

  13. 13

    指向函数转换的指针

  14. 14

    将指向成员的指针类型转换为简单的指针类型

  15. 15

    可以在函数调用期间将指针转换为数组吗?

  16. 16

    将false转换为指针类型void *?

  17. 17

    将 void 指针转换为动态类型

  18. 18

    我可以合法地将指向结构成员的指针转换为指向该结构的指针吗?

  19. 19

    指向void *函数的指针C ++

  20. 20

    将javascript Max函数包装器转换为指向Math.Max的函数指针

  21. 21

    将函数指针转换为noexcept指定的函数指针

  22. 22

    是否可以将struct指针转换为c中的函数指针?

  23. 23

    将*指针转换为***指针

  24. 24

    您可以从C中当前指向的函数中更改指向函数的指针吗?

  25. 25

    当您可以直接将变量作为指针指向时,为什么要在C中创建指针?

  26. 26

    在C中是否可以将指针转换为双指针?

  27. 27

    将转发lambda转换为函数指针

  28. 28

    将Shellcode转换为函数指针

  29. 29

    如何将类型为void(*)()的指针转换为void *

热门标签

归档