[英]Variadic function works in Win32 but not in Win64
我已经使用以下功能已有一段时间了:
void AddRow(int iNumOfColumns,...)
{
int* pValuePerColumn = (int*)&iNumOfColumns+1;
for (int i=0; i<iNumOfColumns; i++)
{
// Do something with pValuePerColumn[i]
}
}
现在事实证明,它对我们的一位客户在Win64上崩溃了。
我手头没有64位平台,但我认为原因是:
调用该函数时,参数将作为64位值推入堆栈。
在这种假设下,我相信用size_t*
替换int*
size_t*
应该可以解决问题。
我的问题是:
取消指向数组最后一个元素或非数组对象之后的指针的指针是未定义的行为:
int* pValuePerColumn = (int*)&iNumOfColumns+1;
...
pValuePerColumn[i]
对于该问题,将类型更改为size_t
无关紧要。
使用变量参数的唯一正确方法是stdarg.h中提供的宏。
您应该使用varargs
以可移植的方式访问额外的参数。 查找va_list
文档。 可能您的代码应该在下一个
void AddRow(int iNumOfColumns,...)
{
va_list ap;
va_start(ap, iNumOfColumns);
for (int i=0; i<iNumOfColumns; i++)
{
int col = va_arg(ap, int);
// Do something with col
}
va_end(ap);
}
正如我记得在Win64上,前四个整数args是通过寄存器而不是通过堆栈传递的,所以使用指针的技巧将不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.