为什么不能在数组中分配几个元素,而在定义数组时初始化数组呢?

问题描述

我们可以这样做:

int list[] = {1,2,3,4,5};

但是我们不能这样做:

int list[5];
list = {1,5};

我认为在第二种情况下,list只会衰减到一个指针,但是当像int list[5]这样定义时,它不会衰减。我不完全了解定义数组时的情况以及定义后访问数组时的情况,有什么区别以及为什么会存在这种区别。我没有找到答案,如果有答案,我会删除

解决方法

int list[] = {1,2,3,4,5};

不是作业。这是初始化。

int list[5];
list = {1,5};

是未初始化数组的定义,后跟(尝试)赋值。

虽然您可以初始化数组(可变长度数组甚至无法初始化!),但您无法为其分配值。

原因在于1970年代初期做出的一些历史性决定。 C或多或少地与一种名为B的语言兼容。在B中没有数组类型,相反,数组名称是B中的指针。您可以分配给它,而不是更改数组内部的值,而是使其指向其他位置。

C数组的不同之处在于C数组对象,它们本身具有大小和全部大小。为了帮助将B程序移植到C,引入了“数组名称衰减到指向第一个元素的指针”。唯一的问题是数组分配可能无法遵循B语义-因此这完全变成了错误。

更多信息,请访问Ritchie's C history page

虽然不太可能实现数组分配,但是您可以使用一些解决方法,例如:

memcpy(list,(const int[]){1,5},sizeof list);