2015-01-21 44 views
3

据我所知,C标准禁止使用阵列的作为(修改)的左值,即,在赋值的左侧:为什么数组不是左值?

int lhs[4], rhs[4] = {0, 1, 2, 3}; 
lhs = rhs; /* illegal! */ 

现在,我已经知道为什么是这种情况。我可以看到上面是声明(和写入到阵列的任何其他分配)定义相当于

memcpy((void *) lhs, (void *) rhs, sizeof(lhs)); 

气派确保该rhs足够大,用户的负担,但它不是决定这应该是这样的。

然而,一个非常类似的例子确实工作完美的罚款:

struct { int a[4]; } lhs, rhs = {{0, 1, 2, 3, 4}}; 
lhs = rhs; 

只需通过包裹所述阵列中的结构,可以得到上述准确描述的行为,即,分配lhs = rhs等同到:

memcpy((void *) &lhs, (void *) &rhs, sizeof(lhs)); 

这是什么原因(我觉得)不一致?允许将数组赋值解释为memcpy s有什么问题吗?

+0

这里回答了这里:http://stackoverflow.com/a/17691191/14955(向下滚动到Edit2:真实原因) – Thilo 2015-01-21 02:13:30

+0

数组名称*是一个左值。我想你问的是为什么数组不可分配。 – 2015-01-21 02:24:27

+0

可能的重复:http://stackoverflow.com/q/27881442/827263 – 2015-01-21 02:25:09

回答

2

C应该是一种低级语言,不会在简单的语法之后隐藏潜在的内存或耗时的任务。一个操作员生成一个汇编指令;为更复杂的东西调用一个函数。在C早期,你不能分配结构体,也不能在函数之间传递它们(你会传递一个指针)。

编辑:

一个结构是一个值。它的大小是静态的,并且在编译时已知。一个数组是多个值,并且大多数数组是动态分配/重新分配的。它们的大小在编译时并不知道,所以编译器不知道要分配和复制多少内存。

int *a, *b; 
a = malloc(/* value based on e.g. user input */); 
b = a; /* compile this into what? */ 

对于它的工作,C将不得不在内部存储一个数组的大小连同指针或与指向的数据一起。这个决定留给了程序员。

+0

“早期C”是什么意思?我知道每一个C *标准都允许赋值结构,所以你的论证对任何可以合理地被称为C的语言都是行不通的。除此之外,如果结构赋值确实在后来被添加到语言中,为什么不数组赋值也包括在内? – yyyyyyy 2015-01-22 16:41:44

+0

关于你的编辑:这是*不是*我正在谈论的一个例子 - 你的代码甚至不包含*数组,加上它编译得很好(将* pointer *的值赋给*指针*'b')! – yyyyyyy 2016-05-06 15:30:21

相关问题