gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:05 24 4
gpt4 key购买 nike

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

#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.

关于C++ - 指向函数的全局指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15321424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com