使用数组中的值来声明另一个数组的大小

时间:2013-07-14 00:24:51

标签: arrays gcc

实际上,我想知道如何将数组值用于另一个数组的大小声明。我有这个测试代码:

main(){

int sz[3]={1,2,3};

int track1[ sz[0] ]={111};
int track2[ sz[1] ]={222,222};
int track3[ sz[2] ]={333,333,333};

printf("%d %d %d\n", track1[0],track2[1],track3[2]);

}

这些是我得到的警告和错误:

test2.c: In function ‘main’:
test2.c:4: error: variable-sized object may not be initialized
test2.c:4: warning: excess elements in array initializer
test2.c:4: warning: (near initialization for ‘track1’)
test2.c:5: error: variable-sized object may not be initialized
test2.c:5: warning: excess elements in array initializer
test2.c:5: warning: (near initialization for ‘track2’)
test2.c:5: warning: excess elements in array initializer
test2.c:5: warning: (near initialization for ‘track2’)
test2.c:6: error: variable-sized object may not be initialized
test2.c:6: warning: excess elements in array initializer
test2.c:6: warning: (near initialization for ‘track3’)
test2.c:6: warning: excess elements in array initializer
test2.c:6: warning: (near initialization for ‘track3’)
test2.c:6: warning: excess elements in array initializer
test2.c:6: warning: (near initialization for ‘track3’)
test2.c:8: warning: incompatible implicit declaration of built-in function ‘printf’

这里有什么问题,ovarall甚至可能,我尝试了什么?

2 个答案:

答案 0 :(得分:2)

当你有一个初始化器时,你实际上不可能有可变数量的元素。只需将其保留,让编译器计算值的数量。

int track1[]={111};
int track2[]={222,222};
int track3[]={333,333,333};

如果没有初始化程序,您的代码将在C(使用C99可变长度数组)和C ++中工作,方法是将constexpr关键字添加到sz的声明中。

答案 1 :(得分:1)

Ben已经回答了静态数组问题。另一种可能性是使用动态分配的数组。例如

int *track1 = (int *)allocate_int_array(sz[0]);
int *track2 = (int *)allocate_int_array(sz[1]);
int *track3 = (int *)allocate_int_array(sz[2]);

这将为您提供从sz []读取t​​rack *数组大小以及在其余代码中使用track1,2和3指针作为数组的选项。当然,释放和其他malloc pitfals适用。