【问题标题】:Passing list as a parameter to a function in c将列表作为参数传递给c中的函数
【发布时间】:2018-03-05 19:02:47
【问题描述】:

我想将多个值作为逗号分隔列表传递给函数,并将该列表接受到数组变量中。类似的东西(虽然它不可编译):

#include <stdio.h>
void passValueAsList (int arr [],int len) {
    int i;
    for (i=0;i <len;i++)
         printf ("%d, ",arr [i]);
 }

 int main () {
       passValueAsList ({1,2,43,5,4,21},6);
       return 0;
  }

我不想在传递之前将列表存储到数组中,而我只想将数组传递到位。

谢谢。

【问题讨论】:

  • 当您从编译器收到错误并想询问该问题时,请将编译器的错误复制并粘贴到您的问题中。
  • 编译器足够聪明,可以避免在不需要时将某些内容存储在内存中。例如,{ int j=3; f(j); } 将执行与 f(3); 相同的操作,而无需先在某处存储 3。
  • “由于存储可能会占用内存中的一些空间......”是的,它会(或寄存器)。您是否正在处理资源严重受限的目标?如果使用几十个字节是一个主要问题,那么可能是时候升级您的硬件了。

标签: arrays c parameter-passing


【解决方案1】:

您可以使用复合文字。传递一个这样的数组。

ISO C99 支持复合文字。复合文字看起来像包含初始化程序的强制转换。它的值是强制转换中指定类型的对象,包含初始化器中指定的元素;它是一个左值。

#include <stdio.h>
void passValueAsList (int arr [],int len) {
    int i;
    for (i=0;i <len;i++)
         printf ("%d, ",arr [i]);
}

int main () {
       passValueAsList ((int []) {1,2,43,5,4,21}, 6);
       return 0;
}

【讨论】:

  • 谢谢@NickS。这正是我想要的。
  • C11 支持吗?
  • @learner 我在 C11 标准 (ISO/IEC 9899:2011) 6.5.2.5 复合文字中找到了关于复合文字的描述。所以是的,它受支持
【解决方案2】:
passValueAsList ({1,2,43,5,4,21},6);

这是无效的 C 语法,简单明了。

正确的语法是:

#include <stdio.h>
void passValueAsList (int arr [], size_t len) {
    size_t i;
    for (i=0;i <len;i++)
         printf ("%d, ",arr [i]);
}

int main () {
    int arr[] = {1,2,43,5,4,21};
    passValueAsList(arr, sizeof arr / sizeof *arr);
    return 0;
}

编辑

C99 引入了compound literals,所以这也是 可能:

#include <stdio.h>
void passValueAsList (int arr [], size_t len) {
    size_t i;
    for (i=0;i <len;i++)
         printf ("%d, ",arr [i]);
}

int main () {
    passValueAsList((int[]){1,2,43,5,4,21}, 6);
    return 0;
}

我不想在传递之前将列表存储到数组中,而我只想将它传递到数组中。因为存储可能会占用内存中的一些空间,这就是我想以逗号分隔的列表传递的原因。

请注意,即使使用复合文字,数组仍将被存储 在内存的某个地方,passValueAsList 仍然是一个指向 阵列的位置。与前面代码的唯一区别是您 main 函数中没有变量。

两个版本的assembly是相同的。

【讨论】:

  • 我已经知道这种方式了。但我想要像我在上面的问题中提到的那样。
【解决方案3】:

使用 C,您可以使用可变参数列表来做到这一点: https://www.tutorialspoint.com/c_standard_library/c_macro_va_arg.htm

但您必须以某种方式设置一个标记,以便您调用的函数知道何时停止从调用堆栈中拉取项目。

您编写的示例调用代码需要 C++。在 C++11 中,您可以让函数将 std::vector 作为参数,并按照示例调用代码中的方式传递值。

【讨论】:

    最近更新 更多