sizeof(pointer_to_a_function)与sizeof(function_name)

oalqel3c  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(74)


的数据
下面是程序的文本:

#include <stdio.h>

int f(int x){
    return x+1;
}

int main() {
    int (*p)(int) = f;

    printf( "%d\n", sizeof(p) );
    printf( "%d\n", sizeof(f) );
}

字符串
这张图片与C代码有关,我的问题只针对C。
这里f是函数名,p是指向函数f的指针。
由于p最终是一个地址,因此根据地址总线的大小,sizeof(p)的输出将为真,这完全没有问题。
这里f也指向函数f。所以f也是一个地址。
我的主要问题是,为什么sizeof(f)的输出不是8,为什么是1,它是如何1的?

nle07wnf

nle07wnf1#

不允许取函数的大小。关于6.5.3.4sizeof运算符的C standard的www.example.com部分指出:
sizeof运算符不应应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。_Alignof运算符不应应用于函数类型或不完整类型。
这被认为是一个 * 约束违反 *,它触发undefined behavior
此外,打印size_t类型的表达式(由sizeof运算符给出的类型)的正确格式说明符是%zu,而不是%d。使用错误的格式说明符也会触发未定义的行为。在这个特定的例子中,你得到了一个对第一种情况有意义的值,但不能保证这一点。

0lvr5msh

0lvr5msh2#

对于初学者,您必须使用转换规范%zu来输出大小为operator的表达式的值

printf( "%zu\n", sizeof( p ) );

字符串
否则,通常使用转换规范%d而不是%zu的这种调用可能会调用未定义的行为。
指针是一个完整的类型。它的大小是已知的。
这里f也指向函数f。所以最终f也是一个地址。
f不是指针。这是一个函数名。根据C标准,你不能对函数应用sizeof运算符。函数可以隐式转换为指向函数的指针。但是,如果允许将sizeof运算符应用于函数,则不会对sizeof运算符中使用的表达式执行隐式转换。例如,数组也可以隐式地转换为指向其第一个元素的指针。但是,如果在sizeof运算符中使用数组,则不会执行此类隐式转换。
考虑下面的代码片段

int a[10];

printf( "sizeof( a ) = %zu\n", sizeof( a ) );

int *p = a;

printf( "sizeof( p ) = %zu\n", sizeof( p ) );


它的输出可能看起来像

sizeof( a ) = 40
sizeof( p ) = 8

相关问题