无论何时执行任何程序,都首先执行main
函数,然后将其他函数调用到RAM。在大多数使用函数指针的程序中,我在打开main
函数的花括号后立即遇到了以下代码:
p = f1; //p is function pointer and f1 is function name
当尚未将函数调用到RAM时,如何将函数的地址分配给函数指针? 还是下面的代码
p = f1;
还需要调用函数吗?
答案 0 :(得分:1)
回答问题:
第一个问题: 您可以为函数指针分配函数地址,而无需事先调用该函数。
第二个问题:
它仅向函数指针p
分配函数f1
的地址(引用)。它不会做任何其他事情,尤其是它不会调用任何函数。
评论中的第三个问题。如果未在程序中的任何位置使用该功能,则该功能通常不会链接到可执行文件中。但是,函数指针的分配就是这种“用途”之一,它将被链接。
答案 1 :(得分:1)
我认为您缺少虚拟地址或程序地址而不是物理地址的概念。 RAM使用物理地址。程序使用虚拟地址,该地址由链接器(unixi中的ld)选择。当操作系统将程序页面加载到RAM时,它将在虚拟地址和物理地址之间创建转换。当操作码引用内存时,CPU使用此转换来检索适当的RAM位置。
摘要: 程序在启动之前会知道其所有静态虚拟地址。 堆栈和动态分配的地址是在程序中计算和管理的。 操作系统/ CPU动态透明地将这些虚拟地址转换为物理地址。
答案 2 :(得分:0)
您可以将p
定义为全局变量并将其初始化为f1
,前提是f1
的声明在范围内并且具有与{{1}的定义兼容的原型}。初始化指针不会调用该函数,也不会访问该函数代码所在的内存。它只是将其地址的值存储到指针变量的位置。
例如:
p
将代码调用到RAM的方式是一个操作系统问题,在C语言中进行编程时,您可以完全忽略此概念。