变量函数va_arg()返回不正确的参数

时间:2012-05-02 10:54:10

标签: c++ function parameters variadic

问题部分解决:请阅读底部

有问题的可变参数函数,最简单的是:

inline Variant::Variant(int type, int dims, ...)
{
   va_list ap;
   va_start (ap, dims);

   //Removed Variant handling code here

   int i=0;
   for(;i<dims;i++){
      int size = va_arg (ap, int);
   }


   //Likewise, Removed Variant handling code here

   va_end (ap);
}

如您所见,有问题的函数是我的Variant类的重载构造函数。这个特定的构造函数在声明数组时会考虑尺寸的大小和数量。

所以这一行在我的main()中运行:

Variant(ARRAY_ARRAYTYPE, 3, 800, 22, 22);

当我在

之后立即断点
int size = va_arg (ap, int);

在函数行中,我得到以下结果:

size holds the value of 800 (correct)
size holds the value of -43587879... (WTF)
size holds the value of 4387643543 (WTF)

然后程序会出现段错误,因为显然这些值是完全无效的值。

有什么想法吗?提前谢谢。

问题部分解决:重新启动以某种方式解决了这个问题,但现在又解决了这个问题......

我的其他可变参数函数(后来调用)似乎可以拾取任何参数 被传递给Variant()构造函数而不是它自己的构造函数。有什么想法吗?

Variant* ArAcc(Variant* in_variable, ...)
{
  va_list app;
int index=0;

int i, j;
int mult;

  va_start (app, in_variable->arrayaccess->num_dimensions);
  for(i=0;i<in_variable->arrayaccess->num_dimensions;i++){
    mult = 1;
    for(j=i+1;j<in_variable->arrayaccess->num_dimensions;j++){
        mult = mult * in_variable->arrayaccess->dim_sizes[j];

    }
    int size = va_arg (app, int);
    mult = mult * size;
    index += mult;
  }
  va_end (app);

return &((*in_variable)[index]);
}

...与

ArAcc(&SomeVariant, 7, 9);

提前致谢。

2 个答案:

答案 0 :(得分:2)

编辑:我没有看到评论中已经提到过这一点。

如果重启解决了问题,这表明问题没有真正解决,恰好不会引起症状。

如果第一个问题确实解决了,第二个函数中的以下行可能会导致第二个问题:

va_start (app, in_variable->arrayaccess->num_dimensions);

那应该是

va_start (app, in_variable);

当然。

根据你的评论我怀疑当第一个案例不起作用时,你实际上是将一个局部变量作为第二个参数传递给va_start而不是函数参数。

答案 1 :(得分:0)

尝试删除内联并使其成为正常功能。