首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对函数使用sizeof的输出

对函数使用sizeof的输出
EN

Stack Overflow用户
提问于 2011-08-09 04:37:10
回答 2查看 820关注 0票数 5

为什么下面的代码给出:

代码语言:javascript
复制
#include<stdio.h>

int voo()
{
    printf ("Some Code");
    return 0;
}


int main() {
    printf ("%zu", sizeof voo);
    return 0;
}

以下输出:

代码语言:javascript
复制
1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-09 04:42:33

C语言没有为函数定义sizeof。表达式sizeof voo违反了约束,并且需要来自任何符合条件的C编译器的诊断。

作为扩展,gcc实现了函数指针上的指针运算。为了支持这一点,gcc任意地假设函数的大小为1,因此,比方说,将42加到函数的地址上,就会得到一个超出函数地址42字节的地址。

它们对void*做了同样的事情,所以sizeof (void)产生1,并且允许在void*上进行指针运算。

如果您想编写可移植的代码,最好避免这两个特性。使用-ansi -pedantic-std=c99 -pedantic获取此类事件的警告。

票数 9
EN

Stack Overflow用户

发布于 2011-08-09 04:45:20

The C99 Standard说:

6.3.2.1/4

除了当它是sizeof运算符54的操作数或一元&运算符时,类型为“函数返回类型”的函数指示符被转换为具有类型“指向函数返回类型的指针”的表达式。

在脚注中,它说

因为这种转换不会发生,所以sizeof运算符的操作数仍然是函数指示符,并且违反了6.5.3.4中的约束。

6.5.3.4的相关段落如下

不能将sizeof运算符应用于具有函数类型或不完整类型的表达式

由此我们可以得出结论,您的程序调用了Undefined Behaviour,并且无法对输出进行任何解释。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6988227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档