为什么数组a
没有被全局变量size
初始化?
#include<stdio.h>
int size = 5;
int main()
{
int a[size] = {1, 2, 3, 4, 5};
printf("%d", a[0]);
return 0;
}
编译错误显示为
可能无法初始化可变大小的对象
据我所知,数组应该由size
初始化。
如果我坚持使用全局变量(如果可能的话),那会是什么答案?
答案 0 :(得分:22)
在C99,6.7.8 / 3:
要实体的类型 initialized应该是一个数组 未知大小或对象类型 不是可变长度数组类型。
6.6 / 2:
可以评估常量表达式 在翻译而不是运行时
6.6 / 6:
整数常量表达式 应具有整数类型且仅应 具有整数的操作数 常量,枚举常数, 字符常量,sizeof 结果为整数的表达式 常量和浮动常量 是演员的直接操作。
6.7.5.2/4:
如果大小是整数常量 表达式和元素类型有一个 已知的常量大小,数组类型是 不是可变长度数组类型; 否则,数组类型是a 可变长度数组类型。
a
具有可变长度数组类型,因为size
不是整数常量表达式。因此,它不能有初始化列表。
在C90中,没有VLA,因此代码是非法的。
在C ++中也没有VLA,但您可以size
为const int
。那是因为在C ++中你可以在ICE中使用const int
个变量。在C中你不能。
据推测,您并不打算a
具有可变长度,因此您需要的是:
#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的情况下,“应该”发生什么。为可变长度数组指定固定大小的初始值没有意义。
答案 1 :(得分:9)
如果要提供初始化程序,则无需告诉编译器数组的大小。编译器将根据您使用它初始化的元素数来计算大小。
int a[] = {1,2,3,4,5};
然后,您甚至可以让编译器通过获取数组的总大小(以字节为单位sizeof(a)
)并将其除以一个元素sizeof(a[0])
的大小来告诉您大小:
int size = sizeof(a) / sizeof(a[0]);
答案 2 :(得分:5)
编译器不能假设main()获得控制时size的值仍为5。如果要在旧式C项目中使用true常量,请使用:
#define size 5
答案 3 :(得分:3)
看起来您的编译器不符合C99 ...说到哪个,您使用的是哪个编译器?如果它是gcc你需要传递开关'-std = c99'....如果你使用的是前C99编译器,那么该语句是非法的,如果是这样的话,那就这样做:
int main() { int a[5]={1,2,3,4,5}; printf("%d",a[0]); return 0; }
在C99之前的标准编译器中,使用常量而不是变量。
答案 4 :(得分:3)
size
是一个变量,C不允许你声明(编辑: C99允许你声明它们,只是不像你那样初始化它们)可变大小的数组像那样。如果要创建大小为变量的数组,请使用malloc或使大小保持不变。
答案 5 :(得分:2)
编译器在声明数组时需要知道数组的大小。 因为数组的大小在声明之后不会改变。 如果将数组的大小放在变量中,可以想象在执行程序时该变量的值会发生变化。 在这种情况下,编译器将被强制为此数组分配额外的内存。 在这种情况下,这是不可能的,因为数组是在堆栈上分配的静态数据结构。 我希望这会有所帮助。
答案 6 :(得分:0)
#include<stdio.h>
/* 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};