问题部分解决:请阅读底部
有问题的可变参数函数,最简单的是:
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);
提前致谢。
答案 0 :(得分:2)
编辑:我没有看到评论中已经提到过这一点。
如果重启解决了问题,这表明问题没有真正解决,恰好不会引起症状。
如果第一个问题确实解决了,第二个函数中的以下行可能会导致第二个问题:
va_start (app, in_variable->arrayaccess->num_dimensions);
那应该是
va_start (app, in_variable);
当然。
根据你的评论我怀疑当第一个案例不起作用时,你实际上是将一个局部变量作为第二个参数传递给va_start
而不是函数参数。
答案 1 :(得分:0)
尝试删除内联并使其成为正常功能。