#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就是一个字符。
你测试一下换成别的。
f就是一个字符。
你测试一下换成别的。
#4
//printf("sizeof(f): %d\n", sizeof(f)); 这个出错了。
不知道你的编译器啥版本
//printf("sizeof(f): %d\n", sizeof(f()));
返回4,应该是函数的地址。
可以debug
看看sizeof的参数
#5
标准里规定sizeof不能用于
函数名
void类型
所以这个结果是不确定的,依赖于编译器(爱怎么)实现(就怎么实现)。
函数名
void类型
所以这个结果是不确定的,依赖于编译器(爱怎么)实现(就怎么实现)。
#6
sizeof(f): 1//在C++标准里面似乎不合标准,在C里面不知道。
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。
#7
至于你这个1的结果我觉得应该是编译扩展的结果,要知道函数名只代表一个入口地址,是没有类型的,对这个没有类型可言的使用sizeof运算符是不合符逻辑的
#8
f咋可能是字符呢?又没有引号!
同时也不可能是变量,因为没定义
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
sizeof( foo );// error
void foo2() { }
sizeof( foo2() );// error
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
sizeof( f() ); 就是求f()返回值的sizeof.
#9
sizeof(f) 应该是函数指针 编译器不一样 可能结果不一样
#10
你编译能通过么,我都不过啊。
sizeof求大小是在编译器就知道大小了,不用等运行时。
sizeof求大小是在编译器就知道大小了,不用等运行时。
#11
嗯 没可能的。
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
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)
$ 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)返回的是根据编译器自己的扩展,多还几个返回类型的函数就能发现
是返回的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;
}
#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())返回的是整型变量的长度
sizeof(f())返回的是整型变量的长度
#20
怎么还认为sizeof(f)返回函数指针的大小呢?标准都说了sizeof不应该应用函数名。就算如果是返回函数指针的大小那也绝对不是1这个答案。这个只是他的编译器自己做的一个扩展。
#21
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。
#22
哥们,不是所有的问题都可以用汇编解决的。
#23
VC++ 2008 Express 编译
1.错误
2.结果是 4 是函数返回值类型的大小
若 char fun();
则结果是 sizeof(char) = 1
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()) 还是可以的
sizeof(f()) 还是可以的
#26
#27
sizeof(f)
#28
这应该取决于编译器,吧
#29
但为什么所有程序都要转换成汇编代码(机器码)再交给CPU去执行捏?
#30
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
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
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就是一个字符。
你测试一下换成别的。
f就是一个字符。
你测试一下换成别的。
#4
//printf("sizeof(f): %d\n", sizeof(f)); 这个出错了。
不知道你的编译器啥版本
//printf("sizeof(f): %d\n", sizeof(f()));
返回4,应该是函数的地址。
可以debug
看看sizeof的参数
#5
标准里规定sizeof不能用于
函数名
void类型
所以这个结果是不确定的,依赖于编译器(爱怎么)实现(就怎么实现)。
函数名
void类型
所以这个结果是不确定的,依赖于编译器(爱怎么)实现(就怎么实现)。
#6
sizeof(f): 1//在C++标准里面似乎不合标准,在C里面不知道。
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。
sizeof(f()): 4//这个是对函数的返回值的类型大小求值。
#7
至于你这个1的结果我觉得应该是编译扩展的结果,要知道函数名只代表一个入口地址,是没有类型的,对这个没有类型可言的使用sizeof运算符是不合符逻辑的
#8
f咋可能是字符呢?又没有引号!
同时也不可能是变量,因为没定义
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
sizeof( foo );// error
void foo2() { }
sizeof( foo2() );// error
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
sizeof( f() ); 就是求f()返回值的sizeof.
#9
sizeof(f) 应该是函数指针 编译器不一样 可能结果不一样
#10
你编译能通过么,我都不过啊。
sizeof求大小是在编译器就知道大小了,不用等运行时。
sizeof求大小是在编译器就知道大小了,不用等运行时。
#11
嗯 没可能的。
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
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)
$ 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)返回的是根据编译器自己的扩展,多还几个返回类型的函数就能发现
是返回的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;
}
#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())返回的是整型变量的长度
sizeof(f())返回的是整型变量的长度
#20
怎么还认为sizeof(f)返回函数指针的大小呢?标准都说了sizeof不应该应用函数名。就算如果是返回函数指针的大小那也绝对不是1这个答案。这个只是他的编译器自己做的一个扩展。
#21
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编。
#22
哥们,不是所有的问题都可以用汇编解决的。
#23
VC++ 2008 Express 编译
1.错误
2.结果是 4 是函数返回值类型的大小
若 char fun();
则结果是 sizeof(char) = 1
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()) 还是可以的
sizeof(f()) 还是可以的
#26
#27
sizeof(f)
#28
这应该取决于编译器,吧
#29
但为什么所有程序都要转换成汇编代码(机器码)再交给CPU去执行捏?
#30
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
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
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