我一直在搜索是否可以用变量初始化数组文字,但找不到。关于上下文,我想将数组文字传递给函数。以下是我正在尝试做的事情:
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标准(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( "%lldn", fun( ( int[] ){a, b, c} , 3 ) );
}
您的代码(没有额外的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;
}
如果初始值设定项是static
,则这是不允许的,因为在程序执行之前需要赋值。来自C99:
具有静态存储持续时间的对象的初始值设定项中的所有表达式都应该是常量表达式或字符串文字。
否则,每个初始值设定项都需要是一个"赋值表达式";或者,换句话说,一个可以分配给对象的有效表达式。
是的,这在C.是合法的
嗯,是的。数组正在初始化,可以通过打印进行测试。
当p返回6时,数组也被正确地发送到函数。但是,请注意,您正在制作一个新的数组以发送给函数。