据我所知,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有什么问题吗?
这里回答了这里:http://stackoverflow.com/a/17691191/14955(向下滚动到Edit2:真实原因) – Thilo 2015-01-21 02:13:30
数组名称*是一个左值。我想你问的是为什么数组不可分配。 – 2015-01-21 02:24:27
可能的重复:http://stackoverflow.com/q/27881442/827263 – 2015-01-21 02:25:09