繁体   English   中英

C ++-函数的全局指针

[英]C++ - global pointer to function

为什么这样做有效? 我认为全局数据是在编译时“初始化”的(编译器以obj文件格式将.global节保存为空字节,因此当该节加载到内存中时,它会初始化为null)。 如果编译器在运行时不知道函数在内存中的位置,那么如何初始化指向函数地址的指针呢?

#include <iostream>

void vypis();

int neco;
int * bla = &neco;
void (*vypis_ptr)() = vypis;

int main(int argc, const char * argv[])
{

}

void vypis() {

}

我删除了iostream的冗余包含,以便您的源实际编译为C,然后在我的系统上将其编译为可执行文件vypis。 这是我发现的:

$ nm vypis | fgrep vypis
00000000004004d0 T vypis
0000000000600888 D vypis_ptr

因此,函数vypis在“文本”部分是全局的,而函数指针vypis_ptr在“数据”部分是全局的。

数据部分中的对象具有存储在可执行文件中的值,我可以通过使用objdump转储数据部分来读取vypis_ptr的内容。

$ objdump -d -j .data vypis

vypis:     file format elf64-x86-64


Disassembly of section .data:

0000000000600878 <__data_start>:
        ...

0000000000600880 <__dso_handle>:
        ...

0000000000600888 <vypis_ptr>:
  600888:       d0 04 40 00 00 00 00 00                             ..@.....

0000000000600890 <bla>:
  600890:       a8 08 60 00 00 00 00 00                             ..`.....

在这里,我们可以看到,值4004d0存储在vypis_ptr但这正是的位置vypis中显示的输出nm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM