【问题标题】:Simple but specific array compiling error (C)简单但特定的数组编译错误(C)
【发布时间】:2020-11-20 06:21:47
【问题描述】:
这是我写的:
const int MAX=100;
int main (){
int notas [MAX]={0};
编译器会这样说:
[错误] 可变大小对象可能未初始化
[警告] 数组初始化器中的多余元素
当我用#define MAX 100 写MAX 时,它可以工作。但是我不明白这样做有什么问题?
【问题讨论】:
标签:
arrays
c
initialization
declaration
variable-length-array
【解决方案1】:
在这种情况下
const int MAX=100;
不创建编译时间常数,因此数组被视为VLA。根据定义,VLA 无法初始化,因此出现错误。
另一方面,#define MAX 100 是一个预处理器宏,根据文本替换属性,它会产生一个编译时常数值100,那么数组不是 VLA,可以初始化根据初始化规则。
【解决方案2】:
这个
const int MAX=100;
int main (){
int notas [MAX]={0};
是一个可变长度数组的声明,其大小在运行时确定,因为变量 MAX 的声明不是 C 中的编译时常量。此类数组可能不会在声明中初始化。
来自 C 标准(6.7.9 初始化)
3 要初始化的实体的类型应该是一个数组
未知大小或不是可变长度的完整对象类型
数组类型。
所以你可以写例如
const int MAX=100;
int main (){
int notas [MAX];
memset( notas, 0, MAX * sizeof( int ) );
否则你可以使用编译时间常数,比如
enum { MAX=100 };
int main (){
int notas [MAX]={0};
【解决方案3】:
尽管声明中有const
const int MAX = 100;
MAX 不是常量表达式(即,其值在编译时已知的东西)。它的值直到 运行时 才知道,所以 notas 的声明被视为可变长度数组声明,并且 VLA 声明可能没有初始值设定项(也不能声明 VLA在文件范围内,也不能是 struct 或 union 类型的成员。
使用预处理宏
#define MAX 100
符号MAX的所有实例在预处理后都被替换为文字100,因此它实际上与写作相同
int notas[100] = {0};
这就是使用预处理器宏起作用的原因。