2012-03-05 71 views
15

我在C中知道我可以做以下事情。在声明之外初始化C数组?

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

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

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

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

我假设它必须做的事情,当内存获取分配在堆栈上的数组,因此在那一点上C可以自动填写我的值,但为什么不能在以后做?

谢谢你们

+2

所以,如果,假设,有人的情况下,在C标准只是不会允许这种(尽管这在技术上是可能的),我们不得不做出一些不同的东西而不是?或者你是不想得到答案?只是想确定。 – 2012-03-05 15:05:33

+1

@NiklasB .:我认为在这种情况下,一个有争议的受过教育的猜测是为了*为什么C语言的设计者决定忽略这个特性将会是一个很好的答案。 – Heinzi 2012-03-05 15:07:54

+0

@Heinzi:哦,我明白了:) – 2012-03-05 15:08:29

回答

6

的一点是,使用int array[]={ }声明初始化您已创建的对象。

实际上,你可以分配值数组后,它一直宣布

int array[5]; 
array[0] = 1, array[1] = 2, ... 

什么,你这样做是分配几个一个单一阵列条目:

array[5] = {1,2,3,4,5}; // array[5] can only contain one value 

This wo而不是合法的:

array[5] = 6; 

希望这是有道理的。只是一个语法问题。

+0

哦。 Duhhh。这真的帮了我。 – kando 2016-11-19 20:03:10

17

这不仅仅是数组,你不能在定义中的任何点上为什么提供初始值设定项。人们有时会将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}。你仍然不能从它分配数组。

3

注意,C99化合物字面允许你“传递数组给函数”:

int your_func(int *test) 
{ 
    ...use test as an array... 
} 

void other_func(void) 
{ 
    int x = rand(); 
    if (your_func((int[]){ 0, 1, 2, x, 3, 4 }) > 0 || 
     your_func((int[]){ 9, x, 8, 7, 6, 5 }) > 0) 
     ...whatever... 
} 

这并不像重新初始化具有不同值的阵列是相同的,但它可能是足够接近该它适合你。

0

在表面的原因是数组几乎无处不在转换为指向第一个元素的指针。如果有两个阵列

double A[5]; 
double B[5]; 

在表达如

A = B; 

两者都已经转化为指针。左边的A尤其不是“左值”,因此您无法分配给它。

这听起来像一个蹩脚的借口,但我的猜测是,历史上它就是这样发生的。 C(和C++)被困在一个早期的语法选择中,如果你想保持与遗留代码的兼容性,那么可能没有太多办法。

+0

您是否有任何引用说这是设计决策背后的原因? – 2012-03-05 18:53:15

+0

@DavidHeffernan,不幸的不是,否则我会给它。在C11中,6.7.1 p6(加上脚注)仍然表明,这个转换为指针的义务被视为数组的基本特征。我认为这是不幸的,特别是分配和指定者将是很好的功能。但期待这种修改的发生是不现实的。 – 2012-03-06 07:23:58

+0

但没有引用,这是猜测。而且我实际上无法看到为什么分配数组无法实现的技术原因。 – 2012-03-06 07:35:29

2

这里的解决方案

//Declaration 
int a[5]; 
int a_temp[5] = {1, 2, 3, 4, 5 }; 
memcpy(a, a_temp, sizeof(a)); 
//Now array a have values 1, 2, 3, 4, 5