c语言中的数组到参数

c语言中的数组到参数,c,arrays,arguments,C,Arrays,Arguments,我是被迫使用循环和真正的长线,还是像这样的东西在c语言中是可能的 int a[5] = {1, 2, 3, 5, 8}; printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]); // this is ok but printf("%d %d %d %d %d\n", a); // is this somehow possible?? 我在问是否有办法。第1点 printf("%d %d %d %d %d\

我是被迫使用循环和真正的长线,还是像这样的东西在c语言中是可能的

int a[5] = {1, 2, 3, 5, 8};
printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]); // this is ok but
printf("%d %d %d %d %d\n", a);                // is this somehow possible??
我在问是否有办法。

第1点

printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
很好,但是想想你拥有的恐怖,比如说10000个元素

第2点

printf("%d %d %d %d %d\n", a); 
基本概念的问题。您没有提供足够的值来打印


基线:在逐个打印数组元素时坚持循环。

#include <stdio.h>

int main(void) 
{
    struct { int a[5]; } A = { { 1, 2, 3, 5, 8 } };

    printf( "%d %d %d %d %d\n", A.a[0], A.a[1], A.a[2], A.a[3], A.a[4] );
    const char *f = "%d %d %d %d %d\n";
    printf( f, A );                 

    return 0;
}
这一行:

printf("%d %d %d %d %d\n", a); 
实际上只是普通的未定义行为,因为1)格式字符串需要5个参数,但您只提供一个;2)格式字符串需要
%d
但您提供一个数组


除了字符数组之外,没有一种内置的方法来输出数组的内容。对于
%s
,它将打印到终止的空字节或精度指定的最大字符数。即使您能够提供阵列的大小,printf规范也不支持它。使用循环即可。

试试看!如果你得到了一个错误或者你得到了什么结果,你就会看到它。我做了,我也用谷歌搜索了,但是我得到了关于可扩展数组的答案。不可能知道它的大小,因为它在传递数组的函数中作为指针接收。所以这是不可能的。回答得好。如果您需要在多个地方使用该逻辑,只需创建自己的
print\u array(const int*array,size\t length)
函数即可。我不完全确定您使用该函数的目的是什么。在我看来,您正在使用机器的ABI来实现C标准所不允许的功能。我错过什么了吗?如果你能解释一下你是如何达到这种效果的,那就太好了。@cmaster是的,你错过了。这是完全有效的代码。堆栈包含五个整数。如果你会发现一台结果不同的机器,那么请告诉我。:)所以这真的是ABI编程。是的,我可以给你一个系统配置,这个配置失败得很惨:一个AMD64 CPU,64位linux,gcc在第二行给出这个输出:
511975424 8 4195931 1
。我很确定这不是一个编译器错误,而是一个简单而简单的未定义行为。@cmaster如果您了解汇编程序代码以及数据在堆栈中的放置方式,那就好了。这就是产生这样一个结果的原因。在我的ABI中,如果参数不是结构的一部分,则会在寄存器中传递参数。很清楚为什么你的程序在我的机器上失败得这么惨。但实际上,我并不真正关心编译器如何将这个对象放在堆栈上,或者它如何传递参数(只要它使用尽可能快的方法)。这个技巧依赖于不属于C标准的东西。因此,它最多只能携带,不应使用。
printf("%d %d %d %d %d\n", a);