簡體   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