Variadic函数在Win32中有效,但在Win64中无效

bar*_*nos 1 c 64-bit variadic-functions

我已经使用了以下功能很长一段时间了:

void AddRow(int iNumOfColumns,...)
{
    int* pValuePerColumn = (int*)&iNumOfColumns+1;

    for (int i=0; i<iNumOfColumns; i++)
    {
        // Do something with pValuePerColumn[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在事实证明它在Win64上为我们的一个客户崩溃了.

我手头没有64位平台,但我假设原因是:

调用该函数时,参数将作为64位值推入堆栈.

在这个假设下,我认为,更换int*size_t*应解决的问题.


我的问题是:

  • 我的分析是否正确?
  • 我的解决方案是否正确
  • 是否有更"常规"的解决方法?

250*_*501 5

解除指向一个超过数组的最后一个元素或非数组对象的指针是未定义的行为:

int* pValuePerColumn = (int*)&iNumOfColumns+1;
...
pValuePerColumn[i]
Run Code Online (Sandbox Code Playgroud)

将类型更改size_t为与此问题无关.

使用变量参数的唯一正确方法是stdarg.h中提供的宏.