用数组调用可变参数函数?

标签 c arrays

在下面的这个例子中,我想将数组的内容传递给一个接收可变数量参数的函数。

换句话说,我想传递给 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/

    相关文章:

    c - 在 c unix 编程中,只允许在一个进程中使用 open() 打开文件

    c - C中的动态数组导致段错误

    c - typedef 结构与结构定义

    python - 如何将 Keras Sequential CNN 的训练数据转换为正确的张量形状?

    java - JOptionPane 降序排列数组*几乎就在那里*

    PHP MySQL 数据库 - 将所有行放入多维数组

    c - ASCII 压缩器适用于短测试文件,不适用于长文件

    c - waitpid 调用后如何将自己的 shell 置于前台?

    javascript - 过滤对象并将其添加到数组中而不重复

    c++ - bool 数组在衰减方面的处理方式不同吗?