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给出错误.为什么?
sizeof(type)返回类型的对象表示形式的大小(以字节为单位)。
sizeof(expr)返回表达式(如果计算)将返回的类型的对象表示形式的大小(以字节为单位)。
情况1
func是一个返回类型值的函数char。所以sizeof(func())与 相同sizeof(char),即1
案例2
&func()不是有效的表达式(您正在尝试获取函数返回值的地址,该地址未定义)
案例3
&func返回函数的地址func,它是一个指针。在 64 位系统上,sizeof(&func)将是指针的大小,即8。它将运行4在 32 位操作系统上。
小智 5
操作数sizeof可以有两种形式:
一个paranthesized 类型名称,例如(char),(int),(struct mystruct),...结果是命名类型的存储大小.
一种表达.结果是表达式将评估的类型的存储大小(但不进行评估).
您的示例都不是类型名称.您的函数的类型名称将是char (void).所以你所有的parantheses都是多余的.
在你的第一个例子中,你有sizeof func().评估func()将返回a char,因此结果是1.
在你的第三个例子中,你有sizeof &func.评估&func会给你一个函数指针,函数指针的大小8在你的机器上.
第二个例子是错误的,&func()不是一个有效的表达式.您不能指向函数调用.在标准条款中,func()不是左值,需要申请&.
在这份声明中
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)
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |