我想知道是否有办法在运行时在内存中获取c函数的大小。
我已经使用过此代码,但它无效:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
int main(void)
{
int t[10];
char c;
offsetof(t, p);
p:
return 0;
}
答案 0 :(得分:7)
答案通常是否定的。你不能。一个原因是因为函数在内存中不一定是连续的。所以他们没有“大小”。有时,编译器(即ICC)会将函数跳转到二进制文件的远程部分并跳回。
请在此处查看相关问题:
答案 1 :(得分:3)
您将数据与代码混淆,变量t
在内存地址方面与函数main
无关。 t
存储在堆栈中,main
位于代码部分。
至于获取函数的大小,没有标准的方法来获取大小。如果你愿意编写一个反汇编程序和静态代码分析,你可能会大致了解它的大小,但即使这样也不是微不足道的,因为最后的ret
指令可能不是函数的最后一条指令,比如说从循环内部返回。
您可以分析编译器/链接器输出数据(PDB,映射文件等)。
但是,为什么你需要知道?
答案 2 :(得分:1)
您可以检查反汇编。反汇编程序适用于大多数环境,编译器本身通常可以从源代码生成它们。
答案 3 :(得分:0)
我已经看过它,但我无法想象你为什么需要它。要记住的是,如果你减去两个指针,它会产生一个ptrdiff_t,如果添加到第一个指针会产生第二个指针。这适用于函数指针!那怎么样:
#include <stdio.h>
int main (void) {
printf("main is %u bytes long\n", (unsigned) (metamain - main));
return 0;
}
void metamain (void) {
}