其中sizeof(size_t)< sizeof(unsigned int)

时间:2016-08-24 12:50:15

标签: c sizeof size-t

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

1 个答案:

答案 0 :(得分:3)

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

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

如果你不相信,你总是可以使用预处理器指令来评估INT_MAX&gt; SIZE_MAX,然后包含检查vsnprintf结果所需的代码。

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

2 (引自:ISO / IEC 9899:201x 7.21.6.12 vsnprintf功能3)
vsnprintf函数返回已写入的字符数 已经足够大,不计算终止空字符,或者是否定义 如果发生编码错误,则为value。因此,空终止输出已经 当且仅当返回的值是非负且小于n时才完全写入。