假设我们有来源:
#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
太大。这看起来很合理,但是在遵守标准的情况下,这样的源代码“保证”不会编译吗?我对特定标准的答案感兴趣。
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
的结果类型。因此,该行为是未定义的。