可以在调用函数之前分配一个函数指针吗?

时间:2018-08-07 15:36:01

标签: c

无论何时执行任何程序,都首先执行main函数,然后将其他函数调用到RAM。在大多数使用函数指针的程序中,我在打开main函数的花括号后立即遇到了以下代码:

p = f1;  //p is function pointer and f1 is function name

当尚未将函数调用到RAM时,如何将函数的地址分配给函数指针? 还是下面的代码

p = f1;

还需要调用函数吗?

3 个答案:

答案 0 :(得分:1)

回答问题:

第一个问题: 您可以为函数指针分配函数地址,而无需事先调用该函数。

第二个问题: 它仅向函数指针p分配函数f1的地址(引用)。它不会做任何其他事情,尤其是它不会调用任何函数。

评论中的第三个问题。如果未在程序中的任何位置使用该功能,则该功能通常不会链接到可执行文件中。但是,函数指针的分配就是这种“用途”之一,它将被链接。

答案 1 :(得分:1)

我认为您缺少虚拟地址或程序地址而不是物理地址的概念。 RAM使用物理地址。程序使用虚拟地址,该地址由链接器(unixi中的ld)选择。当操作系统将程序页面加载到RAM时,它将在虚拟地址和物理地址之间创建转换。当操作码引用内存时,CPU使用此转换来检索适当的RAM位置。

摘要: 程序在启动之前会知道其所有静态虚拟地址。 堆栈和动态分配的地址是在程序中计算和管理的。 操作系统/ CPU动态透明地将这些虚拟地址转换为物理地址。

答案 2 :(得分:0)

您可以将p定义为全局变量并将其初始化为f1,前提是f1的声明在范围内并且具有与{{1}的定义兼容的原型}。初始化指针不会调用该函数,也不会访问该函数代码所在的内存。它只是将其地址的值存储到指针变量的位置。

例如:

p

将代码调用到RAM的方式是一个操作系统问题,在C语言中进行编程时,您可以完全忽略此概念。