问题描述
我们可以这样做:
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);