c - C 中函数类型的大小

标签 c function gcc sizeof c11

我有一些关于 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 中有效吗?

案例 2: [Live Demo]

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

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

案例 3: [Live Demo]

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

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

在这里,案例 3 工作正常,而 案例 2 给出错误。为什么?

最佳答案

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

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

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

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

在您的第一个示例中,您有 sizeof func()。计算 func() 将返回一个 char,因此结果为 1

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

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

关于c - C 中函数类型的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223699/

相关文章:

c - 警告C4047'=':'int'在间接转换级别上与'cast *'上的'int *'不同

python - 函数命名空间概念(赋值前引用)

c++ - 将数组传递给函数,不输出任何内容

c++ - 使用 gcc 3.3 mips32 boost 1_49_0 错误

c++ - 混合库类型(静态与动态)有问题

c - 如何在物理内存中指定变量位置?

c++ - C/C++中通过反射调用函数或方法

c - 使用c中的链表检测变位词

c - C语言编程如何停止输入

c - 从指针数组返回字符串的函数