0

即使想象到这一点,我的大脑也会变得麻木。如果我的问题有点冗长,请耐心等待。所以我已经将我的问题分成几部分。

1)我们在函数地址开始的位/字节处有什么?我的意思是,在一个整数变量的地址处,我们可视化 1 和 0 的 4 个字节(对于 32 位系统),它们表示二进制中的数字形式。对于字符变量,我们用字符的 ASCII 值可视化单个字节。对于 a,double我们相应地可视化 8 个字节。但是我到底应该在以函数地址开头的字节处可视化什么呢?我知道调用堆栈是在调用函数时创建的,但是函数本身呢?在它的地址上,我们是否有二进制形式的函数表达式,ifs loops,等等?代表函数的那些位/字节是否太复杂而无法被人类可视化?说integers

2)我们可以sizeof用于函数吗?为什么或为什么不能?如果我们不知道如何确定分配给函数的大小,那么函数如何具有地址?就像它们有地址一样,它们必须有大小和既然我们有指向函数的指针,那么如何通过指针确定从指针地址开始解释多少字节?毕竟我们可以使用这些指针来调用函数。

请对细节大方。Books 和 Google 在这方面根本没有帮助。

4

3 回答 3

2
  1. 它可以是任何东西。它不需要是任何具体的。

  2. 不,函数的地址只是入口点。例如,它不需要占用连续的内存位置。

通常,函数地址是该函数的实际机器代码开始的地方。没有可靠的方法来判断函数在哪里结束。一些平台可能会按照它们在源代码中出现的功能,一个接一个地布置它们。但其他平台,尤其是那些有IPO的平台,就不会那么简单了。

于 2013-05-04T09:41:51.940 回答
1

在大多数 C 实现中,指向函数的指针被实现为函数机器代码的开始地址。该地址处的字节是调用函数时执行的指令的字节。

在一些实现中,指向函数的指针被实现为关于函数的数据的地址,例如包含机器代码的地址和函数的参数或寄存器使用的描述的数据。

此答案仅用于教育目的,因为这些细节不是 C 标准的一部分,并且因实现而异。

于 2013-05-04T09:50:36.757 回答
1

1. 我通常将函数指针指向的内存想象成汇编程序助记符本身,而不是字节流。如果您使用的是具有固定宽度指令的架构,则可以将其可视化为整数数组——每个整数都编码不同的指令。

2. 不,你不能。SO上有一些很好的答案可以解释为什么你不能sizeof()使用函数,但它基本上归结为这样一个事实,即不能保证该函数的代码全部在一起,因此无法确定大小。如果编译器愿意,它可以发出跳转到另一个函数的指令(具有讽刺意味的是,这正是您调用函数或调用函数指针时发生的情况;))。

拥有某物的地址但不知道其大小是完全可能且有效的——例如,只需查看一个void指针。正如我们不知道void指针指向的数据大小一样,我们也不知道函数指针指向的代码大小。

于 2013-05-04T09:57:04.350 回答