C使用复合文字时出错:从非常数数组表达式初始化的数组

iqjalb3h  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(106)

我试图通过复合文字初始化一个大小为2的数组,错误代码如下

int a[2] = (int[2]){1,2};

gcc编译器返回错误

error: array initialized from non-constant array expression

从gnu页面的复合文字https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html,它说:“如果复合文字的所有元素都是(由)简单的常量表达式,适合用于静态存储时间的对象的初始化器,那么复合文字可以被强制为指向其第一个元素的指针,并在这样的初始化器中使用”。如果我把上面的代码修改成

int* a = (int[2]){1,2};

则它编译成功。我也试过

static int a[] = (int [2]) {1, 2};

它也成功编译。
我想知道为什么原始代码不能工作,为什么编译器说数组是从非常量数组表达式初始化的(根据我的理解,大括号内的1和2是整数文字,可以在编译时确定,因此是常量)。

vnzz0bqm

vnzz0bqm1#

C17标准draft,6.7.9告诉你有两种方法来初始化一个数组:
字符类型的数组可以由字符串文字或UTF-8字符串文字初始化,可以选择用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。
...
否则,具有聚合或联合类型的对象的初始化器应该是元素或命名成员的初始化器的花括号括起的列表。
也许在cppreference上更可读。

相关问题