You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:20:22