sizeof C中的函数类型

msc*_*msc 3 c gcc function sizeof c11

我有一些关于sizeof运算符的情况,它与函数类型一起使用.

案例1: [现场演示]

#include <stdio.h>

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

int main(void)
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

是sizeof(func())用C有效吗?

案例2: [现场演示]

printf("sizeof func = %zu\n", sizeof(&func())); // error
Run Code Online (Sandbox Code Playgroud)

它不起作用.编译器给出错误.为什么?

案例3: [现场演示]

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

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

这里,案例3工作正常,其中案例2给出错误.为什么?

ced*_*rou 5

sizeof(type)返回类型的对象表示形式的大小(以字节为单位)。

sizeof(expr)返回表达式(如果计算)将返回的类型的对象表示形式的大小(以字节为单位)。

情况1

func是一个返回类型值的函数char。所以sizeof(func())与 相同sizeof(char),即1

案例2

&func()不是有效的表达式(您正在尝试获取函数返回值的地址,该地址未定义)

案例3

&func返回函数的地址func,它是一个指针。在 64 位系统上,sizeof(&func)将是指针的大小,即8。它将运行4在 32 位操作系统上。

  • @RafaelEyng通常是禁止的,但GCC返回1。检查这个问题/sf/ask/186647471/ (2认同)

小智 5

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

  • 一个paranthesized 类型名称,例如(char),(int),(struct mystruct),...结果是命名类型的存储大小.

  • 一种表达.结果是表达式将评估的类型的存储大小(但不进行评估).

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

在你的第一个例子中,你有sizeof func().评估func()将返回a char,因此结果是1.

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

第二个例子是错误的,&func()不是一个有效的表达式.您不能指向函数调用.在标准条款中,func()不是左值,需要申请&.


Vla*_*cow 4

在这份声明中

printf("sizeof func = %zu\n", sizeof(func())); 
Run Code Online (Sandbox Code Playgroud)

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

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

4 当 sizeof 应用于类型为 char、unsigned char 或signed char(或其限定版本)的操作数时,结果为 1...

在这份声明中

printf("sizeof func = %zu\n", sizeof(&func())); 
Run Code Online (Sandbox Code Playgroud)

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

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

1一元 & 运算符的操作数应为函数指示符、[] 或一元 * 运算符的结果,或 指定非位域且未使用寄存器存储类声明的对象的左值说明符。

为了进行比较,请考虑以下程序

#include <stdio.h>

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

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

    return &i;
}

int main(void)
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

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

程序输出将是

sizeof func = 8
Run Code Online (Sandbox Code Playgroud)

在这份声明中

printf("sizeof func = %zu\n", sizeof(&func)); 
Run Code Online (Sandbox Code Playgroud)

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

考虑到函数定义应类似于

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