我知道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)
答案 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时才完全写入。