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

使用变量与字面量初始化一维数组的差异解析

变量指定大小与字面量指定大小初始化一维数组的差异

核心差异:固定长度数组 vs 变长数组(VLA)

两段代码的本质区别在于声明的数组类型完全不同,C标准对它们的初始化规则有明确区分:

  • 用字面量5声明的数组是固定长度数组
    编译器在编译阶段就能确定数组的大小(5个int),属于编译期可知大小的对象。C标准允许对这类数组使用初始化列表进行部分初始化:当你只提供3个元素时,剩余的2个元素会被自动初始化为对应类型的默认值(int类型就是0),这也是你第二段代码能正常输出4 6 2 0 0的原因。

  • 用变量size声明的数组是变长数组(VLA)
    数组的大小要到运行阶段才会确定(虽然这里size的值是5,但编译器编译时无法保证它不会被修改)。由于变长数组的大小是动态的,C标准明确禁止对其使用={...}这种初始化列表语法,这就是你遇到variable-sized object may not be initialized错误的直接原因。

变长数组的正确初始化方式

如果你想用变量指定数组大小,只能在声明后手动赋值,比如:

int size = 5;
int scores[size];
// 手动设置前3个元素
scores[0] = 4;
scores[1] = 6;
scores[2] = 2;
// 剩余元素手动置0
for (int i = 3; i < size; ++i) {
    scores[i] = 0;
}
// 遍历输出
for (int i = 0; i < size; ++i)
{
    printf("%d ", scores[i]);
}
printf("\n\n");

或者用memset批量初始化后再赋值:

int size = 5;
int scores[size];
memset(scores, 0, sizeof(scores)); // 把所有元素置0
scores[0] = 4;
scores[1] = 6;
scores[2] = 2;
// 遍历输出...

内容的提问来源于stack exchange,提问作者nobis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:53:17