C语言报错‘variable-sized object may not be initialized’的原因与修复
C语言报错「int variable-sized object may not be initialized」的原因与修复
错误原因
你代码里的const int SIZE=5虽然加了const修饰,但在C语言中它本质还是运行时变量,不属于编译期常量。用它定义的grades[SIZE]是「变长数组(VLA)」,而C标准明确规定:变长数组不允许在声明时用初始化列表(={66,50,93,67,100})直接初始化,这就是第6行报错的核心原因。
修复方法
给你三种可行的修复方案,按推荐程度排序:
方案1:用宏定义替代const变量
宏会在预编译阶段直接替换为常量值,这样数组就变成固定大小的普通数组,可正常初始化:
#include <stdio.h> #define SIZE 5 // 替换原const变量 int main (void) { int grades[SIZE]= {66,50,93,67,100}; double sum= 0.0; int i; printf("\nMy grades are:\n"); for (i=0;i<SIZE;i++) printf("%d\t",grades[i]); printf("\n\n"); for (i=0;i<SIZE;i++) sum=sum+grades[i]; printf("My average is %.2f\n\n",sum/SIZE); return 0; }
方案2:用枚举常量定义SIZE
枚举类型的成员属于编译期常量,同样可用来定义固定大小数组:
#include <stdio.h> int main (void) { enum { SIZE = 5 }; // 枚举常量 int grades[SIZE]= {66,50,93,67,100}; double sum= 0.0; int i; printf("\nMy grades are:\n"); for (i=0;i<SIZE;i++) printf("%d\t",grades[i]); printf("\n\n"); for (i=0;i<SIZE;i++) sum=sum+grades[i]; printf("My average is %.2f\n\n",sum/SIZE); return 0; }
方案3:先声明数组再手动赋值(不推荐)
如果一定要保留const int SIZE,只能先声明变长数组,再逐个元素赋值,这种写法冗余,仅作参考:
#include <stdio.h> int main (void) { const int SIZE=5; int grades[SIZE]; // 手动逐个赋值 grades[0] = 66; grades[1] = 50; grades[2] = 93; grades[3] = 67; grades[4] = 100; double sum= 0.0; int i; printf("\nMy grades are:\n"); for (i=0;i<SIZE;i++) printf("%d\t",grades[i]); printf("\n\n"); for (i=0;i<SIZE;i++) sum=sum+grades[i]; printf("My average is %.2f\n\n",sum/SIZE); return 0; }
内容的提问来源于stack exchange,提问作者Rubén Figueroa
相关产品推荐
相关产品推荐

