【问题标题】:Function addresses consistant?函数地址一致?
【发布时间】:2012-07-05 12:02:55
【问题描述】:

这是在 Windows 7 64 位上使用 C 语言和 VC++ 2010。

有没有一种方法可以可靠且一致地访问函数的地址(c 链接),以便在每次运行程序时它都是相同的地址?

【问题讨论】:

  • ...为了什么目的?而且...您是否同时拥有函数和调用者?
  • @reuben:将地址存储在数据库中? :-D
  • 我拥有函数和调用者,这是因为我想写一个包含指向文件的函数指针的结构,所以我在读取文件时不需要做任何初始化工作.
  • 如果我得到一个指向代码段开头的指针,并使存储的地址与该地址相关,怎么样?例如。 void *address = &my_func - &main;

标签: c function pointers function-address


【解决方案1】:

如果您在运行时获得了地址,那么它应该在该运行中保持稳定。 可能下次会有所不同。

操作系统中的某些功能可能会导致您的可执行代码被加载到不可预测的地址(部分是为了安全,部分是因为两个 DLL 可能需要相同的基地址)。

【讨论】:

    【解决方案2】:

    不,因为对于大多数现代操作系统,无法保证每次都将函数加载到相同的地址。在某些嵌入式设备上,如果您的链接器文件为该函数定义了一个固定地址,您或许可以避免这种情况。

    但是为什么要打扰呢?您可以像对待变量一样获取函数的地址:

    void func(int a)
    {
        a=5;
    }
    
    void main()
    {
        // In case you don't know or don't care about the signature of the function.
        void* p = func;
    
        // In case you do care and might want to call the function
        // at some point through the pointer.
        void (*f)(int) = func;
    
        printf("%p %p",p, f);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 2012-06-27
      • 2013-09-22
      • 1970-01-01
      • 2019-05-05
      • 2012-03-22
      相关资源
      最近更新 更多