函数指针指向C中函数的地址。这意味着一个函数具有一个存储器地址,它将成为任何存储器段的一部分。我只打印了函数的地址,并指向代码段。用C编写的所有函数的地址都在代码段中吗?
#include <stdio.h>
void func()
{
printf("hi!!!\n");
}
int main()
{
void (*fptr)();
fptr = func;
printf("fptr pointing func addr : %p and &fptr : %p\n", fptr, &fptr);
fptr();
while (1) {
sleep(1); /* Sleep for accessing procfs of the process */
}
return 0;
}
程序输出:
[revarath@bgl-vms-vm0251 basic]$ ./a.out &
[1] 20168
[revarath@bgl-vms-vm0251 basic]$ fptr pointing func addr : 0x4005ad and &fptr : 0x7fff301e6b80
hi!!!
c = 10
查找PID以访问procfs:
[revarath@bgl-vms-vm0251 basic]$ ps -ef | grep a.out
revarath 20168 24339 0 04:55 pts/2 00:00:00 ./a.out
revarath 20180 24339 0 04:56 pts/2 00:00:00 grep --color=auto a.out
内存映射输出:
[revarath@bgl-vms-vm0251 basic]$ cat /proc/20168/maps
00400000-00401000 r-xp 00000000 00:2c 124964755 /ws/revarath-bgl/backup/tests/basic/a.out
00600000-00601000 r--p 00000000 00:2c 124964755 /ws/revarath-bgl/backup/tests/basic/a.out
00601000-00602000 rw-p 00001000 00:2c 124964755 /ws/revarath-bgl/backup/tests/basic/a.out
.......
7fff301c8000-7fff301e9000 rw-p 00000000 00:00 0 [stack]
My func addr:0x4005ad位于内存区域00400000-00401000
说函数的内存地址在或指向代码段的位置正确吗?
这里还有更多关于语言的法律答案(例如,不要依赖代码中的系统实现,但是基本上,是的,这就是它的工作原理。
程序中的所有已编译代码,包括您说明的功能,都是所得二进制图像中代码(也称为“文本”)段的一部分。操作系统的加载程序会将所有已编译的代码字节吐到进程内的该内存段中,如果您以这种方式获取静态函数的地址,则会看到其相应的代码位于该段中的某个位置。 main
等也是如此。
已编译程序进入内存并被执行的方式比看上去的少很多魔力。抛开现代操作系统的安全机制等,它有点像这样:
main
函数的第一个字节(通过对您隐藏的C运行时方法)。 当您获得函数的地址时,就没有魔法了,它是指向该函数已编译指令的第一个字节的指针。