【问题标题】:Understanding of C programming syntax [duplicate]了解 C 编程语法 [重复]
【发布时间】:2015-12-20 06:11:59
【问题描述】:

我遇到了这种语法,但我不知道如何开始理解它。

如何开始解码这样一段c编程代码。

(*(void(*)())0)();

我已尝试编译此代码,它编译时没有任何警告或错误。所以它似乎是 c 编程的有效语法。

【问题讨论】:

  • @MarounMaroun;这是 cdecl.org 失败的最好例子。
  • @MarounMaroun 我知道该工具并尝试过它显示语法错误。试图在此工具中破解此代码,但没有帮助
  • @hacks 哦,真的失败了。。我之前没试过。
  • 这会生成一个空函数指针,然后调用它(未定义的行为)
  • 为什么这么急着看懂这么没用的代码。

标签: c


【解决方案1】:

分解如下:

  • (void(*)()) 代表0 的演员表。这里它是一个指向返回类型为void 的函数的指针,并且可以有任意数量的参数。

       (  void  (*)  ( )  )
           ^     ^    ^
           |     |    |
           |     |    |
           |     |    |
           |     |    |
           +     |    +
    Return type  |    Function
                 |
              Pointer
    
  • *(void(*)())0 正在取消引用地址 0x00000000。我认为它是一个函数地址。

  • (*(void(*)())0)();调用函数。

【讨论】:

  • 在阅读了 5 次你的答案之后,现在看来我可以理解了。请添加更多文字以更快地理解它。
  • 地址 0 会有什么功能?如果没有函数,那么分段错误或在该内存中写入的内容将执行正确吗?
  • @JeegarPatel;是的。可能有开机相关的代码。
  • @JeegarPatel 如果您在硬件级别进行编程,那么地址 0 处的任何功能就是碰巧存在的任何功能 - 或者根本没有功能。某些硬件甚至可能不允许您引用该地址。
猜你喜欢
  • 2012-07-07
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多