为什么输出的 vsnprintf 的返回值随着执行次数不同而变化呢?-灵析社区

加班使我熟睡

为什么输出的 vsnprintf 的返回值随着执行次数不同而变化呢? man vsnrpintf 手册上说的返回值是写入最终的字符串长度(如下截图中:the final string),但是实际测试并不是? 按文档说法:返回值应该为3; 实际测试结果:不为3,也不为10,而是14、15、16这样变化的数。 ![image.png](https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241109/d9aadcaed5615ab97395f9088864e382.png) void foo(const char* format, ...){ va_list ap; va_start(ap, format); int res1 = vsnprintf(NULL, 0, format, ap); printf("====res1=%d\n", res1); char buf[200] = {'\0'}; memset(buf, 0, 200); int res2 = vsnprintf(buf, 3, format, ap); printf("====res2=%d, buf=%s\n", res2, buf); //多次直行a.out,值为什么不同呢? va_end(ap); } int main() { foo("say=%d\n", 10000); return 0; } 输出: ./a.out ====res1=10 ====res2=16, buf=sa ./a.out ====res1=10 ====res2=14, buf=sa ./a.out ====res1=10 ====res2=15, buf=sa

阅读量:24

点赞量:0

问AI
感觉对了
va_list 在第一次调用的时候被消耗完了。 第二次调用的时候里面已经不是有意义的内容了。 如果要重新读的话,需要用 va_start 生成一个新的 va_list 。