考虑以下代码:
#include <stdio.h>
#include <limits.h>
#include <stddef.h>
int main(){
size_t cnt = ULONG_MAX;
size_t sz = sizeof(long[cnt]);
printf("%zu\n", sz);
}
6.5.3.4/p2
:
如果操作数的类型是变长数组类型,则 操作数被评估;否则,不计算操作数并且 结果是一个整数常量。
问题是这么大的
sizeof
评估是否定义良好?由于 size_t
是 unsigned
,因此标准保证 unsigned
整数溢出具有明确定义的行为(与可能引发实现定义信号的 signed
不同)。
是的,定义明确。它在运行时对可变长度数组执行
sizeof(element)*number_of_elements
计算。结果再大也没关系。