sizeof函数名的问题

时间:2023-01-30 18:50:29
int func(){
 return 0;
}

void func1(){}

double func2(){
  return  0.1;
}

void main(){
printf("%d\n",sizeof(func));
printf("%d\n",sizeof(func1));
printf("%d\n",sizeof(func2));
}

以上程序在vc中编译不通过,用gcc编译通过,运行结果是:
1
1
1
定义的double型函数,不应该是8字节吗?为什么都是1byte。
这是为什么?

34 个解决方案

#1


对函数名进行sizeof运算是没有定义的行为,但是如果是函数调用则是求函数返回值的大小

#2


sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

#3


R:\atl\33\main.cpp|21|error: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上|
R:\atl\33\main.cpp|22|error: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上|
R:\atl\33\main.cpp|23|error: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上|
||=== 已完成构建: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|

#4


LZ拿了 木棍、铁棍、熟料棍,原来打算问,到底谁比较硬, 结果却问分别有几根。。。。。

#5


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fun)区别是什么?

#6


这课题不值得研究吧

#7


引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fun)区别是什么?

sizeof int
sizeof (int)
sizeof后面一般只跟类型。

#8


引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fun)区别是什么?


我在1楼已经给出你要知道的了。

#9


sizeof 不是函数,而是一个操作符!没参数这东西 是用来计算一个对象或者类型的大小的,其结果是在编译时已经计算好了

#10


sizeof()函数名是没有意义的.....

#11


引用 8 楼 pengzhixi 的回复:
引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fu……


不爱看书的人,你告诉他他也未必相信

#12


看下C标准吧
C89 specified that sizeof’s operand can be any value  except a bit-field, a void expression, or  a function designator.
---所以对函数本身的sizeof应该是无意义的
...
these expressions determine the size of the type used for:
sizeof(F(x)) // ...  F’s return value
----sizeof(F(x))可以得到函数返回值的大小

#13


我编了一个程序如下
#include <stdio.h>
#include <stdlib.h>
int fun(int a)
{
return a;
}
void main ()
{
int a;
a=1;
printf ("%d\n",sizeof(fun(a)));
}
这个是可以运行的,我试了试,没问题!

#14


sizeof()是关键词吧。。。

#15


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

二楼是正解,因为sizeof(func());中的func()是一个返回值了相当于

#16


printf("%d\n",sizeof( int));
printf("%d\n",sizeof( double));

以上代码更能满足你的要求吧。
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
sizeof是操作符而不是函数。

#17



sizeof(fun()); //对返回值调用sizeof,返回返回值的大小
sizeof(fun); //对函数名调用sizeof,无意义

#18


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看


++

#19


这是一个未定义行为,结果不确定。
func是函数名,是这个函数执行的入口;
func()是调用函数后的返回值,是这个函数返回的结果。

#20


楼上正确。
再补充一句:在标准C++中这种方式是不允许的

#21


看看书把

#22


sizeof()是关键词,sizeof(函数名)是没有意义的

#23


1楼已经解释的很清楚了

#24


引用 11 楼 anyidan 的回复:
引用 8 楼 pengzhixi 的回复:
引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

siz……

虽然我之前也不爱看书,但是,从实际结果中,我还是明白这个道理的。

#25


sizeof()不是函数哦

#26


sizeof 关键字...

#27


该回复于2011-11-16 10:11:14被版主删除

#28


这个以前查过,是gcc的扩展。不过我不清楚有什么意义。
ISO C99
6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the parenthesized name of such a type, or to an expression that
designates a bit-field member.
按ISO C这种用法就是错的(不是1L说的未定义,因为这里的Constraints,在Clause 4里说了的shall/shall not被违反时是导致undefined behavior是指不在Constraints的情况下),编译器应该提出错误。
LZ用gcc加-std=c99 -pedantic试试。

#29


引用 28 楼 frankhb1989 的回复:
这个以前查过,是gcc的扩展。不过我不清楚有什么意义。
ISO C99
6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the paren……

……如果要错误是-pedantic-error。
标准方面其实这里应该都一样。可以-std=c89/-ansi。

#30


sizeof不是函数,是关键字

#31


函数名是个指针

#32


函数名是地址。sizeof是操作符,求变量在内存中所占的大小。

#33


对函数名直接进行sizeof操作没见过,也没用过,一般都是进行类型计算结构计算。

MSDN这么说的:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

#34


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看


不过这样写,没有什么意义……

#1


对函数名进行sizeof运算是没有定义的行为,但是如果是函数调用则是求函数返回值的大小

#2


sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

#3


R:\atl\33\main.cpp|21|error: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上|
R:\atl\33\main.cpp|22|error: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上|
R:\atl\33\main.cpp|23|error: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上|
||=== 已完成构建: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|

#4


LZ拿了 木棍、铁棍、熟料棍,原来打算问,到底谁比较硬, 结果却问分别有几根。。。。。

#5


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fun)区别是什么?

#6


这课题不值得研究吧

#7


引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fun)区别是什么?

sizeof int
sizeof (int)
sizeof后面一般只跟类型。

#8


引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fun)区别是什么?


我在1楼已经给出你要知道的了。

#9


sizeof 不是函数,而是一个操作符!没参数这东西 是用来计算一个对象或者类型的大小的,其结果是在编译时已经计算好了

#10


sizeof()函数名是没有意义的.....

#11


引用 8 楼 pengzhixi 的回复:
引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

sizeof( func() ) 和sizeof(fu……


不爱看书的人,你告诉他他也未必相信

#12


看下C标准吧
C89 specified that sizeof’s operand can be any value  except a bit-field, a void expression, or  a function designator.
---所以对函数本身的sizeof应该是无意义的
...
these expressions determine the size of the type used for:
sizeof(F(x)) // ...  F’s return value
----sizeof(F(x))可以得到函数返回值的大小

#13


我编了一个程序如下
#include <stdio.h>
#include <stdlib.h>
int fun(int a)
{
return a;
}
void main ()
{
int a;
a=1;
printf ("%d\n",sizeof(fun(a)));
}
这个是可以运行的,我试了试,没问题!

#14


sizeof()是关键词吧。。。

#15


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

二楼是正解,因为sizeof(func());中的func()是一个返回值了相当于

#16


printf("%d\n",sizeof( int));
printf("%d\n",sizeof( double));

以上代码更能满足你的要求吧。
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
sizeof是操作符而不是函数。

#17



sizeof(fun()); //对返回值调用sizeof,返回返回值的大小
sizeof(fun); //对函数名调用sizeof,无意义

#18


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看


++

#19


这是一个未定义行为,结果不确定。
func是函数名,是这个函数执行的入口;
func()是调用函数后的返回值,是这个函数返回的结果。

#20


楼上正确。
再补充一句:在标准C++中这种方式是不允许的

#21


看看书把

#22


sizeof()是关键词,sizeof(函数名)是没有意义的

#23


1楼已经解释的很清楚了

#24


引用 11 楼 anyidan 的回复:
引用 8 楼 pengzhixi 的回复:
引用 5 楼 jgwei2005 的回复:
引用 2 楼 dizuo 的回复:

sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看

siz……

虽然我之前也不爱看书,但是,从实际结果中,我还是明白这个道理的。

#25


sizeof()不是函数哦

#26


sizeof 关键字...

#27


该回复于2011-11-16 10:11:14被版主删除

#28


这个以前查过,是gcc的扩展。不过我不清楚有什么意义。
ISO C99
6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the parenthesized name of such a type, or to an expression that
designates a bit-field member.
按ISO C这种用法就是错的(不是1L说的未定义,因为这里的Constraints,在Clause 4里说了的shall/shall not被违反时是导致undefined behavior是指不在Constraints的情况下),编译器应该提出错误。
LZ用gcc加-std=c99 -pedantic试试。

#29


引用 28 楼 frankhb1989 的回复:
这个以前查过,是gcc的扩展。不过我不清楚有什么意义。
ISO C99
6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the paren……

……如果要错误是-pedantic-error。
标准方面其实这里应该都一样。可以-std=c89/-ansi。

#30


sizeof不是函数,是关键字

#31


函数名是个指针

#32


函数名是地址。sizeof是操作符,求变量在内存中所占的大小。

#33


对函数名直接进行sizeof操作没见过,也没用过,一般都是进行类型计算结构计算。

MSDN这么说的:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

#34


引用 2 楼 dizuo 的回复:
sizeof 是编译时就确定了,
printf("%d\n",sizeof( func() ));
printf("%d\n",sizeof( func1() ));
printf("%d\n",sizeof( func2() ));
试试看


不过这样写,没有什么意义……