在函数上使用 sizeof 的输出
为什么以下代码给出:
#include<stdio.h>
int voo()
{
printf ("Some Code");
return 0;
}
int main() {
printf ("%zu", sizeof voo);
return 0;
}
以下输出:
1
Why does the following code give:
#include<stdio.h>
int voo()
{
printf ("Some Code");
return 0;
}
int main() {
printf ("%zu", sizeof voo);
return 0;
}
The following output:
1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
C 语言没有为函数定义
sizeof
。表达式sizeof voo
违反了约束,需要任何符合要求的 C 编译器进行诊断。gcc 作为扩展实现了函数指针的指针运算。为了支持这一点,gcc 任意假设函数的大小为 1,因此将 42 添加到函数的地址将得到超出函数地址 42 个字节的地址。
他们对 void 做了同样的事情,因此
sizeof (void)
产生 1,并且允许对void*
进行指针算术。如果您想编写可移植代码,最好避免这两个功能。使用
-ansi -pedantic
或-std=c99 -pedantic
来获取此类事件的警告。The C language does not define
sizeof
for functions. The expressionsizeof voo
violates a constraint, and requires a diagnostic from any conforming C compiler.gcc implements pointer arithmetic on function pointers as an extension. To support this, gcc arbitrarily assumes that the size of a function is 1, so that adding, say, 42 to the address of a function will give you an address 42 bytes beyond the function's address.
They did the same thing for void, so
sizeof (void)
yields 1, and pointer arithmetic onvoid*
is permitted.Both features are best avoided if you want to write portable code. Use
-ansi -pedantic
or-std=c99 -pedantic
to get warnings for this kind of thing.C99 标准 说:
在 54) 脚注中,它说
6.5.3.4 中的相关段落是
,从中我们可以断定您的程序调用了未定义行为,并且无法对输出给出任何解释。
The C99 Standard says:
and in the 54) footnote, it says
The relevant passage out of 6.5.3.4 is
From which we can conclude your program invoked Undefined Behaviour and no explanation can be given for the output.