sizeof 计算函数大小的问题。。。

时间:2023-01-29 18:50:06
#include <stdio.h>

int f()
{
int a, b;
a = b = 0;
return 0;
}

int main()
{
printf("sizeof(f): %d\n", sizeof(f));
printf("sizeof(f()): %d\n", sizeof(f()));
return 0;
}


输出是:

sizeof(f): 1
sizeof(f()): 4


请问这个是怎么回事, 如果函数名是地址,为什么sizeof出来是1????

33 个解决方案

#1


你那个1不是函数名地址吧

#2


mark

#3


有可能sizeof(f)
f就是一个字符。
你测试一下换成别的。

#4



    //printf("sizeof(f): %d\n", sizeof(f)); 这个出错了。

不知道你的编译器啥版本


    //printf("sizeof(f): %d\n", sizeof(f()));
返回4,应该是函数的地址。

可以debug
看看sizeof的参数

#5


标准里规定sizeof不能用于
函数名
void类型
所以这个结果是不确定的,依赖于编译器(爱怎么)实现(就怎么实现)。

#6


sizeof(f): 1//在C++标准里面似乎不合标准,在C里面不知道。
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。

#7


至于你这个1的结果我觉得应该是编译扩展的结果,要知道函数名只代表一个入口地址,是没有类型的,对这个没有类型可言的使用sizeof运算符是不合符逻辑的

#8


引用 3 楼 vip__888 的回复:
有可能sizeof(f)
f就是一个字符。
你测试一下换成别的。

f咋可能是字符呢?又没有引号!
同时也不可能是变量,因为没定义


  C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
  sizeof( foo );// error
  void foo2() { }
  sizeof( foo2() );// error


sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
sizeof( f() ); 就是求f()返回值的sizeof.

#9


引用 6 楼 pengzhixi 的回复:
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。


sizeof(f)  应该是函数指针 编译器不一样  可能结果不一样

#10


你编译能通过么,我都不过啊。
sizeof求大小是在编译器就知道大小了,不用等运行时。

#11


引用 9 楼 phpboy005 的回复:
引用 6 楼 pengzhixi 的回复:
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。


sizeof(f) 应该是函数指针 编译器不一样 可能结果不一样


嗯 没可能的。

The sizeof operator cannot be used with the following operands: 

Functions. (However, sizeof can be applied to pointers to functions.) 
Bit fields. 
Undefined classes. 
The type void. 
Dynamically allocated arrays. 
External arrays. 
Incomplete types. 
Parenthesized names of incomplete types

#12


编译不过。。。

#13


只能说你这个1的结果是你编译器自己扩展的结果。

#14


引用 9 楼 phpboy005 的回复:
引用 6 楼 pengzhixi 的回复:
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。


sizeof(f) 应该是函数指针 编译器不一样 可能结果不一样


sizeof(*f)//这样才会被解释为一个函数指针。

#15


编译器:

$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 

#16


应该是sizeof(f())
是返回的f()函数的返回值大小。
sizeof(f)返回的是根据编译器自己的扩展,多还几个返回类型的函数就能发现

#17


vc++6.0 编译没有通过。

#include <stdio.h>

int f()
{
    int a, b;
    a = b = 0;
    return 0;
}

int main()
{
    printf("sizeof(f): %d\n", sizeof(f));      //错误(illegal sizeof operand)
                                                      //f是非法操作数
    printf("sizeof(f()): %d\n", sizeof(f()));
    return 0;
}

#18


sizeof(f) 可以通过编译吗?

#19


sizeof(f)应该是返回函数指针
sizeof(f())返回的是整型变量的长度

#20


引用 19 楼 delphiboy_lwb 的回复:
sizeof(f)应该是返回函数指针
sizeof(f())返回的是整型变量的长度


怎么还认为sizeof(f)返回函数指针的大小呢?标准都说了sizeof不应该应用函数名。就算如果是返回函数指针的大小那也绝对不是1这个答案。这个只是他的编译器自己做的一个扩展。

#21


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。

#22


引用 21 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。


哥们,不是所有的问题都可以用汇编解决的。

#23


VC++ 2008 Express 编译
1.错误
2.结果是 4 是函数返回值类型的大小
若 char fun();
则结果是 sizeof(char) = 1

#24


demo.cpp:12 col 39: error: ISO C++ forbids applying 'sizeof' to an expression of function type

#25


依赖于编译器的

sizeof(f()) 还是可以的

#26


该回复于2010-05-10 15:04:19被版主删除

#27


sizeof(f)

#28


这应该取决于编译器,吧

#29


引用 22 楼 pengzhixi 的回复:
引用 21 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。


哥们,不是所有的问题都可以用汇编解决的。

但为什么所有程序都要转换成汇编代码(机器码)再交给CPU去执行捏?

#30


引用 29 楼 zhao4zhong1 的回复:
引用 22 楼 pengzhixi 的回复:
引用 21 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。


哥们,不是所有的问题都可以用汇编解决的。

但为什么所有程序都要转换成汇编代码(机器码)再交给CPU去执行捏?


sizeof是编译期就确定的值了,你这个能从汇编代码看出什么端倪?

#31


被这问题折磨了好久!!!!

#32


看看文档中的说明吧:不可操作对象
The sizeof operator cannot be used with the following operands: 

Functions. (However, sizeof can be applied to pointers to functions.)

Bit fields.

Undefined classes.

The type void.

Dynamically allocated arrays.

External arrays.

Incomplete types.

Parenthesized names of incomplete types

#33


看看文档中的说明吧:不可操作对象
The sizeof operator cannot be used with the following operands: 

Functions. (However, sizeof can be applied to pointers to functions.)

Bit fields.

Undefined classes.

The type void.

Dynamically allocated arrays.

External arrays.

Incomplete types.

Parenthesized names of incomplete types

#1


你那个1不是函数名地址吧

#2


mark

#3


有可能sizeof(f)
f就是一个字符。
你测试一下换成别的。

#4



    //printf("sizeof(f): %d\n", sizeof(f)); 这个出错了。

不知道你的编译器啥版本


    //printf("sizeof(f): %d\n", sizeof(f()));
返回4,应该是函数的地址。

可以debug
看看sizeof的参数

#5


标准里规定sizeof不能用于
函数名
void类型
所以这个结果是不确定的,依赖于编译器(爱怎么)实现(就怎么实现)。

#6


sizeof(f): 1//在C++标准里面似乎不合标准,在C里面不知道。
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。

#7


至于你这个1的结果我觉得应该是编译扩展的结果,要知道函数名只代表一个入口地址,是没有类型的,对这个没有类型可言的使用sizeof运算符是不合符逻辑的

#8


引用 3 楼 vip__888 的回复:
有可能sizeof(f)
f就是一个字符。
你测试一下换成别的。

f咋可能是字符呢?又没有引号!
同时也不可能是变量,因为没定义


  C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
  sizeof( foo );// error
  void foo2() { }
  sizeof( foo2() );// error


sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
sizeof( f() ); 就是求f()返回值的sizeof.

#9


引用 6 楼 pengzhixi 的回复:
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。


sizeof(f)  应该是函数指针 编译器不一样  可能结果不一样

#10


你编译能通过么,我都不过啊。
sizeof求大小是在编译器就知道大小了,不用等运行时。

#11


引用 9 楼 phpboy005 的回复:
引用 6 楼 pengzhixi 的回复:
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。


sizeof(f) 应该是函数指针 编译器不一样 可能结果不一样


嗯 没可能的。

The sizeof operator cannot be used with the following operands: 

Functions. (However, sizeof can be applied to pointers to functions.) 
Bit fields. 
Undefined classes. 
The type void. 
Dynamically allocated arrays. 
External arrays. 
Incomplete types. 
Parenthesized names of incomplete types

#12


编译不过。。。

#13


只能说你这个1的结果是你编译器自己扩展的结果。

#14


引用 9 楼 phpboy005 的回复:
引用 6 楼 pengzhixi 的回复:
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。


sizeof(f) 应该是函数指针 编译器不一样 可能结果不一样


sizeof(*f)//这样才会被解释为一个函数指针。

#15


编译器:

$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 

#16


应该是sizeof(f())
是返回的f()函数的返回值大小。
sizeof(f)返回的是根据编译器自己的扩展,多还几个返回类型的函数就能发现

#17


vc++6.0 编译没有通过。

#include <stdio.h>

int f()
{
    int a, b;
    a = b = 0;
    return 0;
}

int main()
{
    printf("sizeof(f): %d\n", sizeof(f));      //错误(illegal sizeof operand)
                                                      //f是非法操作数
    printf("sizeof(f()): %d\n", sizeof(f()));
    return 0;
}

#18


sizeof(f) 可以通过编译吗?

#19


sizeof(f)应该是返回函数指针
sizeof(f())返回的是整型变量的长度

#20


引用 19 楼 delphiboy_lwb 的回复:
sizeof(f)应该是返回函数指针
sizeof(f())返回的是整型变量的长度


怎么还认为sizeof(f)返回函数指针的大小呢?标准都说了sizeof不应该应用函数名。就算如果是返回函数指针的大小那也绝对不是1这个答案。这个只是他的编译器自己做的一个扩展。

#21


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。

#22


引用 21 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。


哥们,不是所有的问题都可以用汇编解决的。

#23


VC++ 2008 Express 编译
1.错误
2.结果是 4 是函数返回值类型的大小
若 char fun();
则结果是 sizeof(char) = 1

#24


demo.cpp:12 col 39: error: ISO C++ forbids applying 'sizeof' to an expression of function type

#25


依赖于编译器的

sizeof(f()) 还是可以的

#26


该回复于2010-05-10 15:04:19被版主删除

#27


sizeof(f)

#28


这应该取决于编译器,吧

#29


引用 22 楼 pengzhixi 的回复:
引用 21 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。


哥们,不是所有的问题都可以用汇编解决的。

但为什么所有程序都要转换成汇编代码(机器码)再交给CPU去执行捏?

#30


引用 29 楼 zhao4zhong1 的回复:
引用 22 楼 pengzhixi 的回复:
引用 21 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。


哥们,不是所有的问题都可以用汇编解决的。

但为什么所有程序都要转换成汇编代码(机器码)再交给CPU去执行捏?


sizeof是编译期就确定的值了,你这个能从汇编代码看出什么端倪?

#31


被这问题折磨了好久!!!!

#32


看看文档中的说明吧:不可操作对象
The sizeof operator cannot be used with the following operands: 

Functions. (However, sizeof can be applied to pointers to functions.)

Bit fields.

Undefined classes.

The type void.

Dynamically allocated arrays.

External arrays.

Incomplete types.

Parenthesized names of incomplete types

#33


看看文档中的说明吧:不可操作对象
The sizeof operator cannot be used with the following operands: 

Functions. (However, sizeof can be applied to pointers to functions.)

Bit fields.

Undefined classes.

The type void.

Dynamically allocated arrays.

External arrays.

Incomplete types.

Parenthesized names of incomplete types