为什么我不能创建一个大小由全局变量确定的数组?

为什么数组不能通过全局变量size初始化?

 #include int size = 5; int main() { int a[size] = {1, 2, 3, 4, 5}; printf("%d", a[0]); return 0; } 

编译错误显示为

可能无法初始化可变大小的对象

据我说,数组应该按size初始化。

如果我坚持使用全局变量(如果可能的话),会有什么答案?

在C99中,6.7.8 / 3:

要初始化的实体的类型应该是未知大小的数组或不是可变长度数组类型的对象类型。

6.6 / 2:

可以在转换期间而不是运行时期间计算常量表达式

6.6 / 6:

整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量。

6.7.5.2/4:

如果size是一个整型常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型; 否则,数组类型是可变长度数组类型。

a具有可变长度数组类型,因为size不是整数常量表达式。 因此,它不能具有初始化列表。

在C90中,没有VLA,因此代码是非法的。

在C ++中也没有VLA,但您可以将size设为const int 。 那是因为在C ++中你可以在ICE中使用const int变量。 在C你不能。

大概你不打算变长,所以你需要的是:

 #define size 5 

如果你真的想要a可变长度,我想你可以做这样的事情:

 int a[size]; int initlen = size; if (initlen > 5) initlen = 5; memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int)); 

或者可能:

 int a[size]; for (int i = 0; i < size && i < 5; ++i) { a[i] = i+1; } 

但是,很难说,在大小!= 5的情况下,“应该”发生什么。为可变长度数组指定固定大小的初始值实际上没有意义。

如果要提供初始化程序,则无需告诉编译器数组的大小。 编译器将根据您初始化它的元素数量来确定大小。

 int a[] = {1,2,3,4,5}; 

然后你甚至可以让编译器通过获取数组的总大小(以字节为单位sizeof(a)并将其除以一个元素sizeof(a[0])的大小来告诉你大小:

 int size = sizeof(a) / sizeof(a[0]); 

在main()获得控制时,编译器不能假设size的值仍为5。 如果要在旧式C项目中使用true常量,请使用:

 #define size 5 

size是一个变量,C不允许你声明( 编辑: C99允许你声明它们,只是不像你那样初始化它们)像这样可变大小的数组。 如果要创建大小为变量的数组,请使用malloc或使大小保持不变。

看起来您的编译器不符合C99 …说到哪个,您使用的是哪个编译器? 如果它是gcc你需要传递开关’-std = c99’….如果你使用的是前C99编译器,那么该语句是非法的,如果是这样的话,请执行以下操作:

 int main(){ 
    int a [5] = {1,2,3,4,5}; 
   的printf( “%d”,一个[0]); 
   返回0; 
 }

在C99之前的标准编译器中,使用常量而不是变量。

编辑:你可以在这里找到更多关于C99标准的信息 …… 这里 ……

编译器在声明时需要知道数组的大小。 因为数组的大小在声明后不会改变。 如果将数组的大小放在变量中,可以想象在执行程序时该变量的值会发生变化。 在这种情况下,编译器将被强制为此数组分配额外的内存。 在这种情况下,这是不可能的,因为该数组是在堆栈上分配的静态数据结构。 我希望这会有所帮助。

 #include /* int size=5; */ #define size 5 /* use this instead*/ /*OR*/ int a[size]={1,2,3,4,5}; /* this*/ int main() { int a[size]={1,2,3,4,5}; printf("%d",a[0]); return 0; } 

int size意味着size是一个变量 ,C不允许变量 size数组。

我在使用VS2008

 const int size=5; 

允许

 int a[size]={1,2,3,4,5};