sizeof(function)总是返回1.为什么?

时间:2018-12-27 02:11:05

标签: c printf function-pointers sizeof

使用sizeof()函数的大小始终返回1

我只是试图找到一个函数的大小,尽管使用sizeof()来查找它的大小总是返回1,即使该函数是一个定义明确的函数也只会返回1。 我只想知道为什么它返回1 。 当说sizeof(funtion)时,它实际上考虑了什么。

考虑一个简单的交换功能。我使用 fun3 只是为了显示所占用地址的差异。

void fun1(int a,int b)
{
 int temp;
 temp=a;
 a=i;
 i=b;
 printf("%d\t %d\n",a,b);
}
void fun2()
{

}
void fun3()
{

}
void main()
{
 printf("fun1\t Address : %d \t Size : %d\n",fun1,sizeof(fun1));
 printf("fun2\t Address : %d \t Size : %d\n",fun2,sizeof(fun2));
 printf("fun3\t Address : %d \t Size : %d\n",fun3,sizeof(fun3));
}

这里的输出是
     fun1地址:4199248大小:1
     fun2地址:4199301大小:1
     fun3地址:4199307大小:1

fun1 占用的地址数量巨大, fun2 仅占用6,但是两者的大小保持不变

2 个答案:

答案 0 :(得分:10)

我怀疑这里有一长串问题会导致回答“这是未定义的行为”。

首先要注意的是,您不应使用%dprintf中打印出指针。 %d修饰符用于打印int,而int并不总是以通常的方式在指针之间转换。例如,在64位系统上,可能是int是32位而指针是64位的情况,这意味着将指针传递到printf,然后尝试打印它与%d一起只能打印一半的位。每当您要打印出指针时,都应使用%p指定符。

这表明您在此处看到的部分内容可能是由于%d仅从指针中拾取了一半位,然后又从指针中拾取了其他位第二个%d修饰符,这意味着您在这里看到的1实际上不是函数指针的大小,而是由于格式字符串错误而造成的垃圾数据。那将是不确定的行为-糟糕的时光!

现在,您将如何打印函数本身的地址?坏消息是,没有便携式的方法可以做到这一点。通常,对于指针,您可以只使用%p修饰符。但是函数指针在C语言中并不常见,因为它们不能隐式转换为普通指针。也就是说,您无法将函数指针例如强制转换为void *void *的形式。造成这种情况的字面原因是“因为规范如此规定”,但更深层次的原因是,在某些非x86,非ARM系统函数中,函数存储在与数据物理不同的内存区域中,并且指针具有非常不同的二进制表示形式比普通的指针。

some heavyweight ways to print out function pointers,但正如您所见,这并不容易。

如何独立地打印出函数指针的大小?尝试using the %zu modifier,它适用于size_t s:

printf("Function pointer has size %zu\n", sizeof(&fun1));

答案 1 :(得分:-3)

因为sizeof被提供给指针时返回的是指针的大小,而不是对象的实际大小。这可能有助于解释问题:

https://en.cppreference.com/w/cpp/language/sizeof