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
&func
return是函数的地址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;
}
我有一些关于 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
&func
return是函数的地址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;
}