1

在 C 中,我们可以使用可变参数函数,例如:

void abc(int x, .. )
{
}

我们可以使用可变数量的参数来调用它们,例如:

abc(1,2,3) or abc(1,2,3,4,5)

但是,在上述两个函数调用中,我们都abc使用我们已知的参数调用了可变参数函数;第一种情况是“1, 2, 3”,第二种情况是“1, 2, 3, 4, 5”。

我的问题是:

有没有办法在运行时调用用户输入的可变数量参数的可变参数函数?

例如,在 中main(),我要求用户输入一定数量的输入,然后使用参数 p1、p2、p3 等将这些输入传递给可变参数函数......

4

5 回答 5

1

实际上和理论上不建议发明这样的东西,尽管解决方法很有可能......使用一些好的数据结构,比如linked list存储任意数量的元素并在调用函数中传递头指针。

于 2013-04-04T09:02:01.177 回答
1

例如,您可以使用数组:

void abc(int size, int *arr) { }

在主要

int size;
int A[MAX];

size = 3;
A[0] = 1; A[1] = 2; A[2]=3;
abc(size,A);

例子

int size=0;
int A[MAX]; 
while(size<MAX && scanf(" %d",&A[size])!=EOF) {
   size++;
}

 if(size>0) abc(size, A);
于 2013-04-04T08:18:23.193 回答
0

不,这是不可能的。
编译器需要在编译期间生成适当的代码并为标识符保留空间。您将尝试更改静态二进制文件,这是不可能的。这实际上就是va_args存在的原因,能够传递未知数量的参数。

于 2013-04-04T08:17:11.753 回答
0

看起来您应该将指针传递给数组。

void yourfunction(int *array, size_t len) {
    //Do what you want in your function
}
于 2013-04-04T08:18:25.723 回答
0

你不能轻易做到这一点。变量参数函数是根据一定的调用约定编译的。因此,任何动态模仿调用约定的尝试都是不可移植的。

如果您确实需要这样做,一种解决方案是使用 libffi。对调用可变参数函数有一些支持。

否则,我同意其他使用具有大小作为参数的数组的解决方案。

于 2013-04-04T08:31:15.877 回答