使用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,但是两者的大小保持不变
答案 0 :(得分:10)
我怀疑这里有一长串问题会导致回答“这是未定义的行为”。
首先要注意的是,您不应使用%d
在printf
中打印出指针。 %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被提供给指针时返回的是指针的大小,而不是对象的实际大小。这可能有助于解释问题: