简单但具体的数组编译错误(C)

Simple but specific array compiling error (C)

这是我写的:

   const int MAX=100;

   int main (){
       int notas [MAX]={0};

编译器表示如下:

[Error] variable-sized object may not be initialized
[Warning] excess elements in array initializer

当我用 #define MAX 100MAX 时,它起作用了。但是我不明白这样做有什么问题?

在这种情况下

 const int MAX=100;

不创建编译时常量,因此数组被视为 VLA。根据定义,无法初始化 VLA,因此会出现错误。

另一方面,#define MAX 100是预处理器宏,基于文本替换属性,它的编译时间常数值为100,然后该数组不是 VLA,可以按照初始化规则进行初始化。

这个

   const int MAX=100;
int main (){
   int notas [MAX]={0};

是可变长度数组的声明,其大小在 运行 时确定,因为变量 MAX 的声明不是 C 中的编译时常量。此类数组可能无法初始化在声明中。

来自C标准(6.7.9初始化)

3 The type of the entity to be initialized shall be an array of unknown size or a complete object type that is not a variable length array type.

所以你可以这样写

   const int MAX=100;
int main (){
   int notas [MAX];
   memset( notas, 0, MAX * sizeof( int ) );

否则你可以使用像

这样的编译时间常量
   enum { MAX=100 };
int main (){
   int notas [MAX]={0};

尽管声明中有const

const int MAX = 100;

MAX 不是 常量表达式 (即,其值在编译时已知的东西)。它的值直到 运行 时间 才知道,因此 notas 的声明被视为可变长度数组声明,而 VLA 声明可能没有初始化程序(也不能在文件范围内声明 VLA,也不能是 structunion 类型的成员)。

使用预处理器宏

#define MAX 100

符号 MAX 的所有实例在预处理后都被文字 100 替换,因此它实际上与写入

相同
int notas[100] = {0};

这就是使用预处理器宏有效的原因。