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

标签 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]
    }
}

现在我们的一位客户发现它在 Win64 上崩溃了。

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

调用函数时,参数将作为 64 位值压入堆栈。

在这种假设下,我相信将 int* 替换为 size_t* 应该可以解决问题。


我的问题是:

  • 我的分析是否正确?
  • 我的解决方案是否正确?
  • 是否有更“传统”的方法来解决这个问题?

最佳答案

取消引用指向数组最后一个元素或非数组对象的指针是未定义的行为:

int* pValuePerColumn = (int*)&iNumOfColumns+1;
...
pValuePerColumn[i]

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

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

关于c - Variadic 函数在 Win32 中有效,但在 Win64 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38498888/

相关文章:

c - 循环固定大小的数组而不在 C 中定义其大小

c - BST 插入操作。如果已经存在重复节点,则不要插入节点

.net - 编译解决方案时MSBuild找不到SGen

64-bit - 使用Visual Studio(vcvarsall.bat)进行编译时应选择哪个64位目标?

java - Java中将可变参数扩展为相应的数量和类型

c# - 为什么 params 'less performant' 不是常规数组?

c - 如何在 lex 中使用 yy_scan_string

c++ - 数组声明和内存布局

msbuild - 在MSBuild中找出当前操作系统的 "Bit"

c - __builtin_va_start(v,l) 的实现