【问题标题】:[C]Can I call va_arg with a larger type than the argument, then cast the value?[C]我可以用比参数更大的类型调用 va_arg,然后转换值吗?
【发布时间】:2018-06-29 22:00:59
【问题描述】:

我想知道这是否是有效的代码:

int a(va_list args, int is_int, ...)
{
    long long n = va_arg(args, long long);
    return (is_int ? ((int)n) : n);
}
void b(va_list args)
{
    int x = -100;
    a(args, 1, x);
}

我写了一些不必要的复杂代码,我犯了错误,我觉得这是最简单的方法来修复我所做的而不重写整个事情,但我不知道这是否会导致错误(或段错误,或其他)。

【问题讨论】:

  • 这被称为测试你的代码......但如果我理解正确......你没有测试......并且你没有错误?
  • 我测试了它,我没有错误,但我知道有时候,当你尝试阅读一些你不应该阅读的东西时,你的代码在大多数情况下甚至可以“工作”如果它远非有效或安全,我编辑了我的帖子,试图澄清我的问题。
  • 你不应该那样做。问题不在于演员阵容,而是va_args 获取的内存比传递给函数的内存多。这会扰乱va_args 的后续调用。恐怕您将不得不重写调用a() 的部分并传递适当的值。

标签: c types casting variadic-functions


【解决方案1】:

不,问题不仅限于大小。如果类型不匹配,则整个程序的行为是未定义的。当传递的实际值符合任一符号时,有一些非常有限的例外情况,例如符号不匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多