C 中函数类型的大小

sizeof a function types in C

我有一些关于 sizeof 运算符的案例,它与 function 类型一起使用。

案例 1 : [Live Demo]

#include <stdio.h>

char func()
{
    printf("sizeof func = %zu\n", sizeof(func())); //Ok. Output : 1
    return 0;
}

int main(void)
{
    func();
}

sizeof(func()) 在 C 语言中有效吗?

案例二: [Live Demo]

printf("sizeof func = %zu\n", sizeof(&func())); // error

它不工作。编译器报错。为什么?

案例三: [Live Demo]

printf("sizeof func = %zu\n", sizeof(&func)); //Ok. Output : 8

这里,sizeof(&func)是否等于指针的大小?

此处,案例 3 工作正常,而 案例 2 给出错误。为什么?

sizeof(type) returns 类型对象表示的字节大小。

sizeof(expr) returns 类型的对象表示的大小(以字节为单位),如果计算,将由表达式return编辑。

案例 1

func 是一个 return 类型为 char 的函数。所以sizeof(func())sizeof(char)是一样的,也就是1

案例 2

&func() 不是一个有效的表达式(你试图获取函数的 return 值的地址,它是未定义的)

案例 3

&funcreturn是函数的地址func,是一个指针。在 64 位系统上,sizeof(&func) 将是指针的大小,即 8。在 32 位 OS.

上它将是 4

sizeof的操作数可以有两种形式:

  • 括号中的类型名称,例如(char)(int)(struct mystruct)、... 结果是指定类型的存储大小。

  • 一个表达式。结果是表达式 计算为(但未计算)的类型的存储大小。

None 您的示例是 类型名称 。您的函数的 类型名称 将是 char (void)。所以你所有的括号都是多余的。

在您的第一个示例中,您有 sizeof func()。计算 func() 会 return 一个 char,因此结果是 1.

在您的第三个示例中,您有 sizeof &func。评估 &func 会给你一个函数指针,函数指针的大小在你的机器上是 8

第二个例子是错误的,&func() 不是一个有效的表达式。您不能使用指向函数调用的指针。在标准术语中,func() 不是 lvalue,它需要应用 &

在此声明中

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

输出表达式的大小(未计算)func()。由于函数的 return 类型为 char,因此表达式 func() 的类型为 char,并且 sizeof( char ) 等于 1。

来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

4 When sizeof is applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1....

在此声明中

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

试图将一元运算符 & 应用于计算为表达式 func() 的临时对象。您不能将运算符应用于临时对象。

来自 C 标准(6.5.3.2 地址和间接运算符)

1 The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

为了比较考虑以下程序

#include <stdio.h>

char * func()
{
    static char i = 0;

    printf("sizeof func = %zu\n", sizeof(&*func()));

    return &i;
}

int main(void)
{
    func();
}

在这个程序中,函数 returns 指向具有静态存储持续时间的左值 i 的指针。所以应用一元运算符 * 你会得到左值。因此,您可以在这种情况下应用运算符 &

程序输出将是

sizeof func = 8

在此声明中

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

已对 char ( * )( void ) 类型的函数指针的运算符 sizeof 求值。再次根据 C 标准的引用,运算符 & 可以应用于函数指示符。

考虑到函数定义应类似于

char func( void )
           ^^^^ 
{
    printf("sizeof func = %zu\n", sizeof(func())); //Ok. Output : 1
    return 0;
}