使用变量与字面量初始化一维数组的差异解析
变量指定大小与字面量指定大小初始化一维数组的差异
核心差异:固定长度数组 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
相关产品推荐
相关产品推荐

