在 C 中将数组分配给 int

Dan*_* D. 2 c arrays scalar initialization braced-init-list

我用C编写了以下代码

int main(){
    int a = {1, 2, 3};
}
Run Code Online (Sandbox Code Playgroud)

看起来分配的变量(在本例中为 a)总是采用第一个数组元素的值。现在我想知道其他数组元素是否被丢弃,或者在a之后写入内存,从而导致缓冲区溢出。

Vla*_*cow 6

本声明

 int a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

在语义上无效(它违反了下面提到的语义规则)。标量对象不能由具有多个初始值设定项的花括号初始值设定项列表来初始化。

来自 C 标准(6.7.9 初始化)

11标量的初始值设定项应为单个表达式,可以选择用大括号括起来。对象的初始值是表达式的初始值(转换后);应用与简单赋值相同的类型约束和转换,将标量的类型视为其声明类型的非限定版本。

也就是说,大括号初始值设定项列表中的逗号被视为初始值设定项的分隔符,并且对于标量对象,只允许使用单个表达式。

当存在多个初始值设定项时,编译器会假定初始化的对象是一个聚合。

要声明一个数组,您需要编写

 int a[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

或者

 int a[N] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

其中N是等于或大于 3 的整数值。