请考虑以下代码:
#include <stdio.h>
#include <limits.h>
#include <inttypes.h>
#include <stddef.h>
int main(){
size_t cnt = SIZE_MAX;
size_t sz = sizeof(long[cnt]);
printf("%zu\n", sz);
}
6.5.3.4/p2
:
如果操作数的类型是可变长度数组类型,则 则计算操作数;否则,不计算该操作数,并且 结果是一个整型常量.
问题是,这种太大的sizeof
判断是否定义得很好?由于size_t
是unsigned
,标准保证unsigned
整数溢出具有明确定义的行为(与signed
不同,在signed
中可能会引发实现定义的信号).
我搞不懂的主要问题是
size_t sz = sizeof(long[SIZE_MAX]); //error: size of unnamed array is too large
甚至不编译Godbolt live example