【发布时间】:2016-08-24 12:50:14
【问题描述】:
我知道 C 标准允许实现
(sizeof(unsigned) > sizeof(size_t))
或
(sizeof(int) > sizeof(ptrdiff_t))
是真的。但是有没有真正的实现,其中之一是正确的?
背景
我写了一个类似于asprintf() 的函数(因为asprintf() 不可移植),而snprintf() 返回一个int 但需要一个size_t 参数,所以我应该检查是否leni(如下所示) 在这段代码中不小于SIZE_MAX?
va_copy(atmp,args)
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string
va_end(atmp);
if(leni<0)
//do some error handling
if(leni>=SIZE_MAX) //do i need this part?
//error handling
size_t lens = ((size_t)leni)+1;
char *newString = malloc(lens);
if(!newString)
//do some error hanling
vsnprintf(newString,lens,format,args)!=lens-1)
【问题讨论】:
-
我不确定这是否真的可行,否则
sizeof(char[LARGE_NUMBER])不会总是有效。 -
@OliverCharlesworth 它并不总是有效,如果你写类似 char str[1024ULL*1024ULL*1024ULL*5];,你会在 32 位机器上得到一个编译错误(至少在我的情况下gcc -m32)(但不在 AMD64 上)
-
@OliverCharlesworth 没必要。如果括号中的常量表达式生成了一个不能用size_t表示的对象,这将是sizeof的结果,那么编译器会产生错误。
-
@2501 - 题外话:如果数组大小是通过变量传递的(即,如果它是 VLA 类型)呢?大概必须是运行时错误/UB。
-
使用静态断言。