我知道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)

最佳答案

虽然标准不禁止INT_MAX不会小于SIZE_MAX,但是函数vsnprintf保证返回的值不会大于SIZE_MAX。

如果函数成功,则返回值必须小于其第二个参数1。此参数的类型为size_t,因此返回值必须小于SIZE_MAX.2。

而且,如果您不确定,则始终可以使用预处理器指令来评估INT_MAX> SIZE_MAX,然后包括检查vsnprintf结果的所需代码。

1在下面的标准引用中提到的标识符n是vsnprintf的第二个参数。

2(引自:ISO/IEC 9899:201x 7.21.6.12 vsnprintf函数3)
vsnprintf函数返回将要写入的字符数
n足够大,不计算结尾的空字符或负数
如果发生编码错误,则返回值。因此,以零结尾的输出已
当且仅当返回值是非负且小于n时,才完全写入。

10-07 15:20