据我所知,C 标准禁止使用数组作为可修改的左值,即在赋值的左侧:
int lhs[4], rhs[4] = {0, 1, 2, 3};
lhs = rhs; /* illegal! */
现在,我一直想知道为什么会这样。我可以看到上面的语句(以及写入数组的任何其他赋值)的定义相当于
memcpy((void *) lhs, (void *) rhs, sizeof(lhs));
并承担确保rhs
对用户来说足够大,但尚未决定应该是这种情况。
然而,一个非常相似的例子does工作完美:
struct { int a[4]; } lhs, rhs = {{0, 1, 2, 3, 4}};
lhs = rhs;
只需将数组包装在一个结构体中,我们就可以准确地获得上面描述的行为,即赋值lhs = rhs
相当于:
memcpy((void *) &lhs, (void *) &rhs, sizeof(lhs));
这种(我认为)不一致的理由是什么?允许将数组赋值解释为有任何问题吗memcpy
s?