【发布时间】:2020-08-05 21:41:59
【问题描述】:
函数指针指向 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]
我的 func addr : 0x4005ad 位于内存区域 00400000-00401000
我的 Cpu 信息:多核 Intel
[revarath@bgl-vms-vm0251 basic]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
编译器:
gcc
gcc version 4.8.5 20150623 (Red Hat 4.8.5-36)
说函数的内存地址在OR指向代码段是否正确?
【问题讨论】:
-
有些 CPU 甚至没有“段”的概念。您的问题不是关于 C 语言,而是关于您的特定编译器、CPU 和操作系统组合,您没有明确提及(尽管我们可以猜测)。
-
另外,"%p" 用于打印
void *的值。没有标准的格式说明符来打印指向函数的指针——正确的方法可能是打印这样的指针,就好像它是一个字节数组一样。 -
@mlp :我更新了 CPU 和编译器信息。请您对此发表意见。
标签: c function linker function-pointers memory-segmentation