提问人:Aditya Kurrodu 提问时间:7/22/2022 最后编辑:Vlad from MoscowAditya Kurrodu 更新时间:7/22/2022 访问量:135
我们可以在 C 中用变量启动数组文字吗?
Can we initiate an array literal with variables in C?
问:
我一直在寻找我们是否可以启动带有变量的数组文字,但找不到它。有点上下文,我想将数组文字传递给函数。以下是我正在尝试做的事情:
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;
}
答:
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。
请注意,由于该函数不会更改传递的数组,因此第一个参数应具有限定符,并且为避免溢出,最好将返回类型声明为 。const
long 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 中是合法的。
评论
int x[3] = {a,b,c};
是有效的语法。