我的大脑变得麻木,甚至只是想象这个。如果我的问题有点罗嗦,请跟我说。所以我把我的问题分成几部分。
1)从函数的地址开始的位/字节处有什么?我的意思是,在整数变量的地址,我们可视化4字节(对于32位系统)的1和0表示二进制形式的数字。对于字符变量,我们使用字符的ASCII值可视化单个字节。对于double
,我们相应地可视化8个字节。但是我应该在从函数地址开始的字节处看到什么?我知道在调用函数时会创建一个调用堆栈,但是函数本身呢?在它的地址处我们有函数的表达式{{ 1}} s,if
等是否为二进制形式?表示函数的那些位/字节是否过于复杂而无法通过人类进行可视化而不像loops
那样?
2)我们可以使用integers
作为函数吗?为什么或为什么我们不能?如果我们不知道如何确定分配给函数的大小,那该怎么做函数有地址吗?就好像它们有地址一样,它们必须有大小,因为我们有指向函数的指针,如何通过指针确定从指针地址开始解释多少字节?毕竟我们可以使用这些指针来调用函数
请详细说明。书籍和谷歌在这方面根本没有帮助。
答案 0 :(得分:2)
它可以是任何东西。它不需要任何具体的内容。
没有。函数的地址只是入口点。例如,它不需要占用连续的内存位置。
通常,函数地址是该函数的实际机器代码开始的位置。没有可靠的方法来判断函数的结束位置。某些平台可能会在源代码中一个接一个地布置功能。但其他平台,特别是那些IPO的平台,将不会那么简单。
答案 1 :(得分:1)
在大多数C实现中,指向函数的指针被实现为函数机器代码开始的地址。该地址的字节是调用函数时执行的指令的字节。
在一些实现中,指向函数的指针被实现为关于函数的数据的地址,例如包含机器代码的地址的数据以及函数的参数或寄存器使用的描述。
这个答案仅用于教育目的,因为这些细节不是C标准的一部分,因实施而异。
答案 2 :(得分:1)
1。 我通常将函数指针指向的内存可视化为汇编程序助记符而不是字节流。如果您使用的是具有固定宽度指令的体系结构,则可以将其可视化为整数数组 - 每个编码不同的指令。
2。
不,你不能。在SO上有一些很好的答案可以解释为什么你不能sizeof()
一个函数,但它基本上归结为这个函数的代码不能保证全部在一起的事实,所以不可能确定大小。如果需要,编译器可以发出跳转到另一个函数的指令(具有讽刺意味的是,这正是在调用函数或唤起函数指针时发生的情况;))。
拥有某个地址并且不知道它的大小是完全可能和有效的 - 例如,只需查看void
指针即可。就像我们不知道void
指针指向的数据大小一样,我们不知道函数指针指向的代码大小。