【问题标题】:Cast a pointer to point to main function in C [closed]将指针转换为指向 C 中的主函数 [关闭]
【发布时间】:2020-10-07 13:11:54
【问题描述】:

您好,我看到如下指针示例:

void main()
{
    int a=197,*p=&a;
    (int(*)())p==main;
} 

不知道(int(*)())p==main的声明是做什么的?

【问题讨论】:

  • 它没有做任何有用的事情,而且绝对没有任何成就。无论您在哪里找到该示例,它似乎都不是学习 C++ 的好资源。
  • 请说明此问题是针对 C 还是 C++。它们是不同的语言。
  • 您的标题并不能真正反映您提出的实际问题。
  • 指向main 的函数指针在C++ 中并不是那么有用。 C++ 标准声明The function main shall not be used within a program。我的语言律师很弱,所以我不确定这是否延伸到持有指向main 的指针,但拥有指向main 的指针表明迟早有人会使用指向main 的指针,并且之后Crom only knows what's going to happen.

标签: c++ c pointers casting int


【解决方案1】:

== 是一个比较运算符。您将指向main() 函数的指针与指向变量a 的指针进行比较。但是您没有使用比较,例如在 if 语句中,因此该行实际上并没有做任何事情。

【讨论】:

    【解决方案2】:

    如果我们把它分成更小的部分,我们有

    • (int(*)())p
    • ==
    • main

    第一个是p 的转换,指向一个指针,该指针采用不确定数量的参数(在 C 中)或不带参数(在 C++ 中)。

    它将这个指针与main衰减到的指针进行比较。

    然后丢弃布尔结果(结果不使用)。

    请注意,这里的 C 和 C++ 之间存在很大的语义差异。

    【讨论】:

    • (int()()) 让我对这句话感到困惑。他们为什么不直接使用 (int) 将指针转换为指向 int 变量?
    • @TiếnThànhNguyễn 因为指向函数的指针不必与任何其他指针相同。
    【解决方案3】:

    不知道语句 (int(*)())p==main 做了什么?

    int(*)() 是一种类型。它是一个指向返回 int 且不带参数的函数的指针。

    (T)expr 这是显式转换,即强制转换。右手表达式的结果被转换为括号中的类型。 (int(*)())expr 将右手表达式转换为指向函数的指针。

    (int(*)())p 中,转换后的表达式为pp 是一个指向 int 类型指针的变量。由于原始指针未指向函数,因此就 C++ 标准而言,结果值是任意的。

    (int(*)())p==main 将转换后的指针与main 函数的地址进行比较。比较的结果被丢弃。


    附:您已声明 main 返回 void。这在 C++ 中是不允许的。此外,因此,指向函数main 的指针与指针类型int(*)() 不匹配。要解决此问题,请声明 main 以返回 int

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 1970-01-01
      • 2013-10-14
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多