sizeof(函数指针) vs sizeof(函数名)

Anu*_*dav -1 c function-pointers function sizeof implicit-conversion

在此输入图像描述

以下是程序的文本:

#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) );
}
Run Code Online (Sandbox Code Playgroud)

该图像与 C 代码相关,我的问题仅针对 C。

f是函数的名称,并且p是指向该函数的指针f

由于p最终是一个地址,因此根据地址总线的大小,输出结果sizeof(p)为真,这完全没问题。

这里f也是指向函数f。所以最终f也是一个地址。

我的主要问题是为什么 的输出sizeof(f)不是8,为什么是1以及如何是1?

dbu*_*ush 9

不允许获取函数的大小。C 标准中有关操作员的第 6.5.3.4 节规定sizeof

sizeof运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。该 _Alignof运算符不应应用于函数类型或不完整类型。

这被视为违反约束,从而触发未定义的行为

此外,用于打印类型 的表达式size_t(即运算符给出的类型)的正确格式说明sizeof符是%zu,而不是%d。使用错误的格式说明符也会触发未定义的行为。在这种特殊情况下,您得到的值对于第一种情况有意义,但不能保证这一点。