*(void **)(&funcp)在涉及dlsym()的这段代码中做什么?

测试程序

有人可以帮我解释这行代码(从这里开始)?

*(void **) (&funcp) = dlsym(libHandle, argv[2]); 

我不明白是什么*(void **) (&funcp)

增白剂

这可能会澄清它(从此处开始):

更新我没有包含完全相同的链接是表露无疑我错过了在原来的问题的链接。:P)

/* The rather clumsy cast above is necessary because the ISO C standard
   does not require that pointers to functions can be cast back and
   forth to 'void *'. (See TLPI pages 863-864.) SUSv3 TC1 and SUSv4
   accept the ISO C requirement and propose casts of the above
   form as the workaround. However, the 2013 Technical Corrigendum
   (TC1) to SUSv4 requires casts of the following more natural form
   to work correctly:

       funcp = (void (*)()) dlsym(libHandle, argv[2]);

   Various current compilers (e.g., gcc with the '-pedantic' flag)
   may still complain about such casts, however. */

从本质上讲,这是一种避免不得不将void*fromdlsym()强制转换为函数指针的方法,而是将数据重新解释funcp为avoid*并将其存储在其中。这是通过采取的地址来实现的funcp(变量本身的地址),假装的地址指的是void*(通过(void**)铸造),解除引用它,并存储void*dlsym()进去。更简单的形式也可能在实践中起作用。

通过获取数据地址,将该地址转换为指向不同类型的指针并取消引用的这种“重新解释”数据的方法通常被称为类型整理双关语来自于不同的方式,这是真正的双关语是如何工作太解释当具有不同的含义相同的数据。

(类型修剪在某些情况下可能是不安全的,包括当编译器使用严格的别名规则时,它可以假设不同类型的某些指针没有别名(它们没有引用相同的数据)。上面的转换可能在您获得函数指针和void*引用相同数据时违反了严格的别名,尽管在这种情况下这是“可能在实践中起作用的东西。”

(ISO C不需要将函数指针安全地转换为void指针并返回的原因可能是函数和数据(void指针指向“数据”)分别存储在某些计算机上。由于它们是分开的,因此它们也可能使用不同的名称。地址长度或格式,以免在函数指针和数据指针之间进行强制转换。以这种方式分隔代码和数据的体系结构称为哈佛体系结构。)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

*(void **)(&funcp)在涉及dlsym()的这段代码中做什么?

来自分类Dev

void Function()在Dart中做什么?

来自分类Dev

什么是void []?

来自分类Dev

为什么在这段代码中我会得到“ void函数中非预期的非void返回值”

来自分类Dev

void在打字稿中做什么/意味着什么?

来自分类Dev

void(*)()在代码中是什么意思

来自分类Dev

(void)var实际上做什么?

来自分类Dev

(void)(p)在这里做什么?

来自分类Dev

void()和void {}有什么区别?

来自分类Dev

void *和*(void **)有什么区别?

来自分类Dev

这段代码中的“ s”是做什么的?

来自分类Dev

这段代码中的[0]在做什么?

来自分类Dev

C ++中void(*)()和void(&)()之间的区别

来自分类Dev

C中()的(void)是什么

来自分类Dev

无法从pthread中的void *(类名)(void *)类型转换为void *(*)(void *)类型

来自分类Dev

decltype(void())中的void()到底是什么意思?

来自分类Dev

C中的void *(* routine)(void *)是什么意思?

来自分类Dev

Swift中的void->(void)是什么意思?

来自分类Dev

这段代码试图做什么?

来自分类Dev

这段C ++代码做什么?

来自分类Dev

什么是|| 在这段代码中做什么?这段代码的目的类似于 C 中的 switch(condition)?

来自分类Dev

为什么Void类存在?

来自分类Dev

为什么Void类存在?

来自分类Dev

为什么Java使用void?

来自分类Dev

什么是auto classMemberFunction()-> void {}`签名?

来自分类Dev

如何避免此代码中的void分配?

来自分类Dev

使用(void)someInt的原因;在代码中

来自分类Dev

使用(void)someInt的原因;在代码中

来自分类Dev

为什么(void **)类型可以分配给(void *)或(int *)?

Related 相关文章

  1. 1

    *(void **)(&funcp)在涉及dlsym()的这段代码中做什么?

  2. 2

    void Function()在Dart中做什么?

  3. 3

    什么是void []?

  4. 4

    为什么在这段代码中我会得到“ void函数中非预期的非void返回值”

  5. 5

    void在打字稿中做什么/意味着什么?

  6. 6

    void(*)()在代码中是什么意思

  7. 7

    (void)var实际上做什么?

  8. 8

    (void)(p)在这里做什么?

  9. 9

    void()和void {}有什么区别?

  10. 10

    void *和*(void **)有什么区别?

  11. 11

    这段代码中的“ s”是做什么的?

  12. 12

    这段代码中的[0]在做什么?

  13. 13

    C ++中void(*)()和void(&)()之间的区别

  14. 14

    C中()的(void)是什么

  15. 15

    无法从pthread中的void *(类名)(void *)类型转换为void *(*)(void *)类型

  16. 16

    decltype(void())中的void()到底是什么意思?

  17. 17

    C中的void *(* routine)(void *)是什么意思?

  18. 18

    Swift中的void->(void)是什么意思?

  19. 19

    这段代码试图做什么?

  20. 20

    这段C ++代码做什么?

  21. 21

    什么是|| 在这段代码中做什么?这段代码的目的类似于 C 中的 switch(condition)?

  22. 22

    为什么Void类存在?

  23. 23

    为什么Void类存在?

  24. 24

    为什么Java使用void?

  25. 25

    什么是auto classMemberFunction()-> void {}`签名?

  26. 26

    如何避免此代码中的void分配?

  27. 27

    使用(void)someInt的原因;在代码中

  28. 28

    使用(void)someInt的原因;在代码中

  29. 29

    为什么(void **)类型可以分配给(void *)或(int *)?

热门标签

归档