在下面的这个例子中,我想将数组的内容传递给一个接收可变数量参数的函数。
换句话说,我想传递给 printf
foo
的内容按值,因此,在堆栈上传递这些参数。
#include <stdarg.h>
#include <stdio.h>
void main()
{
int foo[] = {1,2,3,4};
printf("%d, %d, %d, %d\n", foo);
}
我知道这个例子看起来很愚蠢,因为我可以使用
printf("%d, %d, %d, %d\n", 1,2,3,4);
.想象一下我正在打电话 void bar(char** a, ...)
相反,数组是我从 RS232 收到的东西......编辑
换句话说,我想避免这种情况:
#include <stdarg.h>
#include <stdio.h>
void main()
{
int foo[] = {1,2,3,4};
switch(sizeof(foo))
{
case 1: printf("%d, %d, %d, %d\n", foo[0]); break;
case 2: printf("%d, %d, %d, %d\n", foo[0], foo[1]); break;
case 3: printf("%d, %d, %d, %d\n", foo[0], foo[1], foo[2]); break;
case 4: printf("%d, %d, %d, %d\n", foo[0], foo[1], foo[2], foo[3]); break;
...
}
}
最佳答案
I would like to pass to printf the content of foo by value and thus, pass these arguments on the stack.
您不能按值传递数组。不是通过“正常”函数调用,也不是通过可变参数(基本上,这只是 读取 堆栈的不同方式)。
每当您使用数组作为函数的参数时,被调用的函数接收的是一个指针。
最简单的例子是字符数组,又名“字符串”。
int main()
{
char buffer1[100];
char buffer2[] = "Hello";
strcpy( buffer2, buffer1 );
}
什么
strcpy()
“sees”不是两个数组,而是两个指针:char * strcpy( char * restrict s1, const char * restrict s2 )
{
// Yes I know this is a naive implementation in more than one way.
char * rc = s1;
while ( ( *s1++ = *s2++ ) );
return rc;
}
(这就是为什么数组的大小只能在声明数组的范围内知道。一旦你传递它,它只是一个指针,没有地方放置大小信息。)
将数组传递给 varargs 函数也是如此:最终在堆栈上的是指向数组(第一个元素)的指针,而不是整个数组。
如果:,您可以通过引用传递数组并在被调用函数中使用它做有用的事情
argc
/argv
),或 标准
printf()
为 "%s"
做最后一个和字符串(以 '\0'
结尾),但 不具备这样做的能力,例如在您的示例中,int[]
大批。所以你必须编写自己的自定义 printme()
. 在任何情况下,您都不会“按值”传递数组。如果您考虑一下,对于较大的数组,将所有元素复制到堆栈中并没有多大意义。
关于用数组调用可变参数函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36548780/