为什么这有效?我认为全局数据在编译时“初始化”(编译器以 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
的位置纳米
。
关于C++ - 指向函数的全局指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15321424/