【发布时间】:2020-02-07 08:29:35
【问题描述】:
如果我写:
int some_arr[4];
some_arr = {0, 1, 2, 3};
然后我的编译器(在本例中为 GCC)会抱怨我在 { 之前没有表达式。所以我需要使用复合文字,很好:
int some_arr[4];
some_arr = (int[]){0, 1, 2, 3};
现在我们看到我不能给数组赋值。
什么?
我可以用memcpy(some_arr, (int[]){0, 1, 2, 3}, sizeof(int[4])) 之类的东西“规避”这个问题,或者通过一个接一个(或通过循环)分配给some_arr 的每个元素。我无法想象GCC 无法解析我所写的单独分配(一个不关心用户的懒惰编译器甚至可能在预处理器中完成),所以它似乎归结为“标准说不”。那么为什么标准说这个特殊的东西是禁止的?
我不是在寻找标准中的语言说它是不允许的,而是在寻找关于标准的这一部分是如何形成的历史课。
【问题讨论】:
-
有趣的是,如果数组是结构中的一个字段,那么 C 会很乐意让您分配整个结构,包括数组。 (这有时用于从函数返回堆栈分配的数组。)
-
您要求的不是 C 的可用功能。您必须逐个分配元素。在声明中,您可以使用
int some_arr[4] = {0, 1, 2, 3};一次性初始化数组。注意初始化和分配之间的区别。 -
C 是一种古老的语言 C 中的操作旨在模仿汇编程序 - 将数组的内容分配给数组是一项复杂的操作,需要几条指令甚至一个循环 - 所以它不是原始操作 - 因此不包括在内。
-
@KonradRudolph 我认为不同之处在于结构的大小始终是已知的,而数组的大小在传递给函数时会丢失。
-
我猜Why can't a modifiable lvalue have an array type? 是我们最好的帖子。我试图从 Ritchie 的“C 开发”中找到任何直接引用,但没有找到。此外,this answer 的最后一次编辑几乎是 Ritchie 解释其原理的论文的准确摘要。