C++ - 指向函数的全局指针

标签 c++ c pointers

为什么这有效?我认为全局数据在编译时“初始化”(编译器以 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/

相关文章:

c++ - 混合 C C++ 代码时动态库中的链接问题

c - Linux 内核的这个源代码有什么作用?

c++ - 使用 pselect 进行同步等待

c++ - 为什么不同的指针会表现得好像它们共享相同的值?

c++ - 表达式 `&(*some_vector.end())` 是否定义明确?

c++ - 如何从使用 for 循环中的 vector 大小的 vector 中删除元素

c++ - 使用结构体指针显示一维数组

c - 当结构体的属性是指向另一个结构体的指针时

c++ - 如何为 std::map 或 QMap 预分配内存?

java - 获取 ttyS0 : 1 input overrun(s)