我知道C标准允许在哪里实现
(sizeof(unsigned) > sizeof(size_t))
Run Code Online (Sandbox Code Playgroud)
要么
(sizeof(int) > sizeof(ptrdiff_t))
Run Code Online (Sandbox Code Playgroud)
是真的.但是有没有真正的实现,其中一个是真的?
背景
我编写了一个类似于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)
Run Code Online (Sandbox Code Playgroud)
虽然标准并不禁止 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 时,空终止输出才被完全写入。
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |