【问题标题】:Pointer to main function in c指向c中主函数的指针
【发布时间】:2022-01-18 04:37:36
【问题描述】:

当我们创建一个指向主函数的指针并调用它时,它是像递归一样复制堆栈内存中的数据还是只是指向它并重新开始。

【问题讨论】:

  • main和其他任何函数在这方面没有区别
  • 两者都不是。每当您调用一个函数时,无论是main 还是任何其他函数,该函数的新信息都会被压入堆栈。它不复制已经存在的内容(也就是说,它不直接复制堆栈上已经存在的内容;新数据可能相同,因为新调用与旧调用执行相同的操作),堆栈指针也不是改为指向原来main信息的位置。
  • @EugeneSh。 main()可能会错过return语句
  • 对于嵌入式系统,我怀疑您真正在寻找的是如何强制执行 MCU 重置,因为这将恢复所有寄存器值以及软件。

标签: c embedded


【解决方案1】:

这是有效的 C 代码:

int main(void) {
    main();
}

如果您编译并运行它,您会注意到它会因分段错误而崩溃。你基本上是在炸毁堆栈。这表明它实际上在每个嵌套调用中消耗了一些堆栈。


再举个例子:

与任何递归函数一样,您需要有一种机制来保证递归限制在您的环境允许您使用的范围内。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        main(--argc, ++argv);
        printf("%s\n", *argv);
    }
}

这将以相反的顺序打印所有命令行参数。

【讨论】:

  • 哇!你比我早两分钟得到答案。除了我添加了__builtin_frame_address(0)%p 打印以显示堆栈指针和int (*ptr_to_main)(int,char **) = main; 并通过它调用之外,该示例几乎与我的示例相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多