在函数上使用 sizeof 的输出

发布于 2024-11-28 10:11:28 字数 227 浏览 1 评论 0原文

为什么以下代码给出:

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

℉絮湮 2024-12-05 10:11:28

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 expression sizeof 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 on void* 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.

尬尬 2024-12-05 10:11:28

C99 标准 说:

6.3.2.1/4

除非是
sizeof 运算符 54) 或一元 & 的操作数运算符,一个函数指示符
type ''function returns type'' 被转换为类型为 ''pointer to
函数返回类型''。

在 54) 脚注中,它说

由于未发生此转换,因此 sizeof 运算符的操作数仍然是函数指示符,并且违反了 6.5.3.4 中的约束。

6.5.3.4 中的相关段落是

sizeof 运算符不应应用于具有函数类型或
不完整类型

,从中我们可以断定您的程序调用了未定义行为,并且无法对输出给出任何解释。

The C99 Standard says:

6.3.2.1/4

Except when it is the
operand of the sizeof operator 54) or the unary & operator, a function designator with
type ‘‘function returning type’’ is converted to an expression that has type ‘‘pointer to
function returning type’’.

and in the 54) footnote, it says

Because this conversion does not occur, the operand of the sizeof operator remains a function designator and violates the constraint in 6.5.3.4.

The relevant passage out of 6.5.3.4 is

The sizeof operator shall not be applied to an expression that has function type or an
incomplete type

From which we can conclude your program invoked Undefined Behaviour and no explanation can be given for the output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文