我们可以在 C 中用变量启动数组文字吗?

Can we initiate an array literal with variables in C?

提问人:Aditya Kurrodu 提问时间:7/22/2022 最后编辑:Vlad from MoscowAditya Kurrodu 更新时间:7/22/2022 访问量:135

问:

我一直在寻找我们是否可以启动带有变量的数组文字,但找不到它。有点上下文,我想将数组文字传递给函数。以下是我正在尝试做的事情:

int fun(int * a, int num){
    int sum=0;
    for (int i=0; i< num; ++i){
        sum = sum + a[i];
    }
    return sum;
}

int main(){

    int a = 3, b =2, c = 1 ;

    int x[3] = {a,b,c}; // Is this legal? It compiles fine on all compilers I tested.
    int p = fun( (int[3]){a,b,c} , 3); // I want to do something like this. pass a literal to the fucntion
    return 0;
}
数组 c 参数 文本 存储持续时间

评论

0赞 dbush 7/22/2022
您是否尝试过编译和运行代码?结果如何?
1赞 Raildex 7/22/2022
int x[3] = {a,b,c}; 是有效的语法。
0赞 AKX 7/22/2022
好吧,该代码工作正常,所以我会说“是”?
0赞 Aditya Kurrodu 7/22/2022
@AKX我尝试了几个编译器,它有效,但不确定 C 标准是否允许
0赞 AKX 7/22/2022
好吧,我希望这些编译器遵守标准。你不会吗?

答:

1赞 AKX 7/22/2022 #1

您的代码(没有额外的 x 数组)使用 -std=c99 编译得很好,所以是的,我会说它是标准的 C99 代码。

#include <stdio.h>

int fun(int a[], int num) {
  int sum = 0;
  for (int i = 0; i < num; ++i) {
    sum = sum + a[i];
  }
  return sum;
}

int main() {
  int a = 3, b = 2, c = 1;
  int p = fun((int[3]){a, b, c}, 3);
  printf("%d", p);
  return 0;
}
0赞 Zulfiqar Chaudhry 7/22/2022 #2

是的。数组正在按应有的方式初始化,可以通过打印它来测试。

数组也被正确地发送到函数,因为 p 返回 6。但是,请注意,您正在创建一个新数组以发送到该函数。

2赞 Vlad from Moscow 7/22/2022 #3

从 C 标准(6.7.9 初始化)

4 初始值设定项中具有静态对象的所有表达式 或线程存储持续时间应为常量表达式或字符串 文字。

此记录中定义的字符串文本

int p = fun( (int[3]){a,b,c} , 3);

具有自动存储期限。因此,您可以使用非常量表达式初始化它,特别是使用变量 a、b 和 c。

请注意,由于该函数不会更改传递的数组,因此第一个参数应具有限定符,并且为避免溢出,最好将返回类型声明为 。constlong long int

这是一个演示程序。

#include <stdio.h>

long long int fun( const int * a, size_t n )
{
    long long int sum = 0;

    for ( size_t i = 0; i < n; ++i )
    {
        sum += a[i];
    }

    return sum;
}

int main( void )
{
    int a = 3, b = 2, c = 1 ;

    printf( "%lld\n", fun( ( int[] ){a, b, c} , 3 ) );
}
1赞 Jonathon S. 7/22/2022 #4

如果初始值设定项是 ,则不允许这样做,因为需要在程序执行之前分配该值。从 C99 开始:static

对于具有静态存储持续时间的对象,初始值设定项中的所有表达式都应为常量表达式或字符串文本。

否则,每个初始值设定项都需要是一个“赋值表达式”,或者换句话说,一个可以赋值给对象的有效表达式。

所以是的,这在 C 中是合法的。