首页 > 解决方案 > 提供额外参数时可变参数函数崩溃

问题描述

我目前正在从事一个项目,该项目涉及使用 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;
}

编辑:我注意到交换colorandstr参数的顺序不再导致崩溃,所以我想更好的问题是为什么?不应该va_list只考虑可变参数和字符串吗?

编辑:好的,事实证明,变量参数列表之前的最后一个参数是必须传递给va_start函数的参数,如本页所述: https ://linux.die.net/man/3/va_start 我完全错过了这种微妙。谢谢大家!

标签: c++

解决方案


推荐阅读