sizeof 对于假设的超大对象有什么影响?

问题描述 投票:0回答:1

假设我们有来源:

#include <stddef.h>
struct foo
{
    char b ;
    char a [ SIZE_MAX ] ;
} ;
int main ( void )
{
    const size_t z = sizeof ( struct foo ) ;
    printf("%zu\n", z);
    return 0 ;
}

对于

sizeof (struct foo)
,编译器会出现什么行为?不能有
struct foo
类型的对象,因为它的大小会大于
SIZE_MAX

我发现 C17 标准(草案)(N2176)中关于

sizeof
运算符的讨论中没有涵盖这种情况。

我正在使用一个声称遵守 C11 标准的 gcc 版本(已过时)(而且,AFAICT,确实如此)。它无法编译并报告

struct foo
太大。这看起来很合理,但是在遵守标准的情况下,这样的源代码“保证”不会编译吗?我对特定标准的答案感兴趣。

c compilation sizeof evaluation
1个回答
0
投票
sizeof ( struct foo )

是一个算术表达式,通过添加各个成员的大小和填充来计算

struct foo
的假设大小,则它将受到无符号整数算术规则的约束,该规则将以
SIZE_MAX
+1 为模对结果进行包装,根据 C 2024 6.2.5。
但是,未指定 

sizeof

来像使用

+
运算符一样执行算术运算。由 C 2024 6.5.1 中的这条规则管辖似乎更合适:

如果在表达式求值期间发生“例外”条件(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为为 未定义。

sizeof

定义为产生其操作数的大小。
struct foo

的大小不在

size_t
的范围内,这是
sizeof
的结果类型。因此,该行为是未定义的。
    

© www.soinside.com 2019 - 2024. All rights reserved.