gpt4 book ai didi

c - 在声明以外的时间初始化 C 数组?

转载 作者:太空狗 更新时间:2023-10-29 16:30:37 27 4
gpt4 key购买 nike

我知道在 C 中我可以执行以下操作。

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

现在这只有在声明数组时才合法。但是我想知道为什么以后这样做不合法?但是在程序的后面,执行以下操作是不合法的。

test[5] = {10, 20, 30, 40, 50}; 

或类似的东西。为什么是这样?我知道这是不合法的,我不是在提示,但是有人可以给我一个更技术性的解释,说明为什么我不能这样做吗? (即不要只是说 C 规范不允许它或类似的东西)

我假设它必须在堆栈上为数组分配内存时做一些事情,所以那时 C 可以自动填充我的值,但为什么它不能稍后做?

谢谢大家

最佳答案

不仅仅是数组,你不能在定义之外的任何时候为任何东西提供初始化器。人们有时会引用诸如 int i; 之类的第二个语句。 i = 0; 作为“初始化 i”。事实上,它正在分配给 i,它之前持有一个不确定的值,因为它没有被初始化。将此称为“初始化”很少会造成混淆,但就语言而言,那里没有初始化程序。

赋值和初始化对于语言来说是不同的事情,即使它们都使用 = 字符。数组不可赋值。

数组不可赋值的原因在别处有介绍,例如 Why does C++ support memberwise assignment of arrays within structs, but not generally? .简短的回答是“历史原因”。我不认为有任何致命的技术原因无法更改语言以允许数组赋值。

还有一个次要问题,语法上 {1, 2, 3, 4, 5} 是一个初始化器,而不是数组文字,因此即使数组是可赋值的,也不能用于赋值.我不确定为什么 C89 没有数组文字,可能只是没有人抽出时间来要求它们。 C99 引入了一般的“复合文字”语法,特别是数组文字:(int[]) {1, 2, 3, 4, 5}。您仍然无法从中分配给数组。

关于c - 在声明以外的时间初始化 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568808/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com