c++ - 提供额外参数时可变参数函数崩溃
问题描述
我目前正在从事一个项目,该项目涉及使用 PDCurses 库在执行期间操纵光标位置,并且我编写了一个 printf 包装器,以便可以在每次打印的基础上切换文本颜色。当将此程序从 VC++ 2008 移植到 VS2019 时,发现该 printf 包装器在尝试打印字符串时会因访问冲突而崩溃,而在打印任何其他类型时则不会。
不确定原因,我写了一个小测试程序来尝试看看问题是否真的是可变参数函数,结果证明只有在函数中附加了一个额外的参数时才会发生这种崩溃。
这打印成功:
#include <stdarg.h>
#include <stdio.h>
void pdprint(const char* str, ...)
{
va_list args;
va_start(args, str);
// Print the string
vprintf(str, args);
fflush(stdout);
va_end(args);
}
int main(int argc, char* argv[])
{
pdprint("Hello World\n");
pdprint("This %d is a %s\n", 1, "test");
getchar();
return 0;
}
这不(请注意函数上的额外参数pdprint
,在这种情况下未使用,但在函数中使用它会导致相同的结果):
#include <stdarg.h>
#include <stdio.h>
void pdprint(const char* str, int color, ...)
{
va_list args;
va_start(args, str);
// Print the string
vprintf(str, args);
fflush(stdout);
va_end(args);
}
int main(int argc, char* argv[])
{
pdprint("Hello World\n", 0);
pdprint("This %d is a %s\n", 0, 1, "test");
getchar();
return 0;
}
编辑:我注意到交换color
andstr
参数的顺序不再导致崩溃,所以我想更好的问题是为什么?不应该va_list
只考虑可变参数和字符串吗?
编辑:好的,事实证明,变量参数列表之前的最后一个参数是必须传递给va_start
函数的参数,如本页所述:
https ://linux.die.net/man/3/va_start
我完全错过了这种微妙。谢谢大家!
解决方案
推荐阅读
- python - 将脚本 .srt 文件解析为可读文本
- qt - 如何使可见属性在 QML 中立即起作用?
- javascript - 显示块后点击 Javascript 转换
- arrays - 这个数组应该是可变的,但我一直收到一个错误,说它是一个 let 常量......即使它是用 var 声明的?
- python - 改变 xticks matplotlib
- string - 具体的字符串排序[Python 2.7]
- excel - 动态增长合并单元格的高度
- ngfor - 如何动态添加多个字段,以便使用 Angular 6 以反应形式将所有这些值存储在数组中?
- arrays - 我们可以在 Julia 中的哪个数组中找到元素?
- sql - SQL Union all Null 与 Redshift 中的一样